当前位置:首页 » 编程语言 » Oracleloopsql

Oracleloopsql

发布时间: 2022-06-18 08:44:26

❶ Oracle中使用PL/sql怎样用循环插入多条数据

使用loop循环,比如:
for
item
in
(select
a,b,c
from
table_a
where
条件)
loop
insert
into
table_b(a,b,c)
values
(item.a,item.b,item.c);
end
loop;
也可以使用索引表循环,以上只是一个简单的例子,需要根据你的具体情况选择循环方式

❷ oracle菜鸟提问:SQL中 循环的用法

你这个要 定义个 游标, 然后 游标循环

一个游标处理的例子:

SQL> DECLARE
2 v_id INT;
3 v_value VARCHAR(10);
4 -- 定义游标.
5 CURSOR c_test_main IS
6 SELECT id, value FROM test_main;
7 BEGIN
8 -- 打开游标.
9 OPEN c_test_main;
10 -- 填充数据.
11 FETCH c_test_main INTO v_id, v_value;
12 -- 假如检索到了数据,才处理.
13 WHILE c_test_main%FOUND LOOP
14 dbms_output.put_line(v_value);
15 -- 填充下一条数据.
16 FETCH c_test_main INTO v_id, v_value;
17 END LOOP;
18 -- 关闭游标
19 CLOSE c_test_main;
20 END;
21 /
TWO
THREE
ONE

PL/SQL procere successfully completed.

❸ Oracle PL/SQL求大神指点如何改成while和loop形式(最好注释下)初学者谢谢

这个还是比较简单的啊,你看你的例子里面:
for j in 2..trunc(i/2) loop 就是说用一个计数器j从2到i/2取整(截断)循环这么多次,end loop就标志这段循环结束了,单独一句exit;就是从这句跳出循环,你想改成while,while是这么写的:
while true loop
...;

end loop;
那你可以仿造这个for,你在declare部分加一个j的申明并初始化,for循环开头就写成

while j < trunc(i/2) loop
其他都不用变了,具体这个条件怎么写,是要和你初始化j同步的,要保证和原来的循环次数一样,假如说你的j也初始化为2,那么条件就是j !> trunc(i/2),外层i循环同理

❹ oracle中超难的sql,横向统计,需要大侠们帮帮,让所有疑问的人都能得到帮助,回答请给出例子

主要目的动态拼出如下sql
select tb.time,
max(case
when tb.id = 1 then
user1
end) as a001,
max(case
when tb.id = 2 then
user1
end) as a002,
max(case
when tb.id = 3 then
user1
end) as a003
from tb
group by tb.time;

--以下为测试部分
create table ta (id int,name varchar2(20));
create table tb (id1 int,time varchar2(20),user1 varchar2(20),id int);
insert into ta values(1,'a001');
insert into ta values(2,'a002');
insert into ta values(3,'a003');
insert into tb values(1,'2011-01-01','u001',1);
insert into tb values(2,'2011-01-01','u002',2);
insert into tb values(3,'2011-01-01','u003',3);
insert into tb values(4,'2011-01-02','u004',1);
insert into tb values(5,'2011-01-02','u001',2);
insert into tb values(6,'2011-01-02','u001',3);

create or replace procere test_p
as
sql_str varchar2(10000);
begin
for rec in ( select * from ta ) loop
sql_str := sql_str||'max(case when tb.id = '||rec.id||' then user1 end) as '|| rec.name ||',' ;
end loop;
sql_str := 'select tb.time, '||rtrim(sql_str,',')||' from tb group by tb.time';
--dbms_output.put_line(sql_str);
execute immediate sql_str;
end;

最后执行test_p 就能达到你想要的效果了。

❺ 在oracle中创建一个存储过程,来循环获取 a表中存放的查询sql语句 并一条一条的执行该sql语句并存下来。

CREATE
OR
REPLACE
PACKAGE
BODY
PKG_A_TESTPACKAGE
IS
PROCEDURE
PKG_A_TESTPROCEDURE(PRM_参数
IN
VARCHAR2,
PRM_返回值
OUT
NUMBER,
PRM_错误信息
OUT
VARCHAR2)
IS
TYPE
CURSOR_TYPE
IS
REF
CURSOR;
CUR_SQL
CURSOR_TYPE;
TYPE
TYP_REC_INFO
IS
RECORD(
COLUMN
VARCHAR2(1000));
LREC_INFO
TYP_REC_INFO;
BEGIN
PRM_返回值
:=
0;
--
循环获取查询SQL
FOR
REC_SQL
IN
(SELECT
查询SQL
FROM
存放SQL的表
WHERE
条件)
LOOP
BEGIN
OPEN
CUR_SQL
FOR
REC_SQL.查询SQL;
LOOP
--
获取查询的信息
FETCH
CUR_SQL
INTO
LREC_INFO;
--存放查询结果,这里只针对单列的查询结果
--
如果没有取到退出
EXIT
WHEN
CUR_SQL%NOTFOUND;
END
LOOP;
CLOSE
CUR_SQL;
END;
END
LOOP;
EXCEPTION
WHEN
OTHERS
THEN
PRM_返回值
:=
-1;
PRM_错误信息
:=
'执行PKG_A_TESTPROCEDURE出错';
END
PKG_A_TESTPROCEDURE;
END
PKG_A_TESTPACKAGE;
按照你的思路写的,具体需要根据你自己实际需求修改扩充一下

❻ oracle sql 管道函数是什么

oracle管道函数是一类特殊的函数,关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数返回值类型必须为集合。
例子:
create or replace function f_pipeline_test
return MsgType
PIPELINED
as
begin
for i in 1 .. 10
loop
pipe row( 'Iteration ' || i || ' at ' || systimestamp );
dbms_lock.sleep(1);
end loop;
pipe row( 'All done!' );
return;
end;
/

❼ oracle存储过程循环执行SQL语句

实现方式错了,批量移动数据应该使用Cursor,而不是像分页那样每次都查询。
每次都查询可能会导致重复数据。
正确方式应该是打开一个Cursor,循环Cursor来插入,使用计数器来控制每次COMMIT的行数:
declare
TYPE R_CURSOR IS REF CURSOR;
i number;
a1_cursor R_CURSOR;
a1_row A1%ROWTYPE;
begin
open a1_cursor FOR
select ID, NAME from A1;
i := 0;
loop
fetch a1_cursor
into a1_row;
exit when a1_cursor%notfound;
INSERT INTO A2 VALUES a1_row;
i := i + 1;
if i >= 5 then
commit;
i := 0;
end if;
end loop;
close a1_cursor;
commit;
end;

❽ Oracle中使用PL/SQL怎样用循环插入多条数据

使用loop循环,比如:
for item in (select a,b,c from table_a where 条件) loop
insert into table_b(a,b,c) values (item.a,item.b,item.c);
end loop;
也可以使用索引表循环,以上只是一个简单的例子,需要根据你的具体情况选择循环方式。

❾ 如何使用oracle提供的SQL

Sql性能非常差的时候,oracle提供了SQL_TRACE来跟踪sql的执行情况。

注:分析sql的方式比较多,还有根据优化器、sql执行计划来分析。

SQL_TRACE能够将sql执行的过程输出到一个trace文件里面。

首先设置自己定义的trace文件的标识方便查找。

alter session set tracefile_identifier='mytest';

然后对当前会话启动SQL_TRACE,最好不要一直打开该开关,代价比较大。

alter session set sql_trace=true;

然后我们执行一条sql语句。

最后关闭该开关的状态。

alter session set sql_trace=false;

我们可以从目录%ORACLE_BASE%/diag/rdbms/orcl/orcl/trace(11g版本的路径,如果是10g的应该不一样)中

找到自己定义的trace文件。

原始的trace文件的可读性不高,我们一般使用oracle自带的工具,tkprof来处理这个trace文件。我们可以查看tkprof的帮助。

tkprof orcl_ora_3820_mytest.trc out.txt

我们来看刚才生成的trace文件,头部信息描述了tkprof 的版本以及报告中一些列的含义,对于任何一条sql语句,都应该包含Parse—sql分析阶段,Execute—sql执行阶段,Fetch—数据提取阶段,横向的列如图所示,包含消耗cpu时间0.00秒,操作总耗时0.04秒,物理读取了0个数据块,没有发生current方式的读取(一般在update会发生),一共提取记录1条。

Misses in library cache ring parse: 0表示这是一次软分析(关于硬分析和软分析下面会接着谈到)

Optimizer mode: ALL_ROWS表示oracle的优化器模式为ALL_ROWS。这也就是前面提到的另外的分析方式优化器。

下面是sql执行的具体计划,可以看到执行计划选择的是全表扫描。

经过处理以后的trace文件的确比较容易看明白,它有助于我们分析sql的性能问题。

下面我通过一个trace实例来解释一下,为什么OLTP系统中需要变量绑定机制。

当用户和数据库建立连接,并发送一条sql语句以后,oracle会对该sql进行hash函数运算(hash算法提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,每一个真实值只能有一个键值,但是一个键值可以对应多个真实值,以方便存取),得到一个hash值,然后到共享池中寻找是否有匹配的hash值的sql存在,如果有,就直接使用该sql的执行计划去执行sql。如果没有,oracle就会认为这是一条新的sql语句,然后按照语法分析,语义分析,生成执行计划,执行sql这些步骤来执行最终把结果返回给用户。这些步骤也被成为硬分析,可以想象,如果减少硬分析,能够大大降低数据库花费在sql解析上的资源开销。

我们先执行一条sql 1000次,比较绑定变量和不绑定变量的差异。得到结果以后,要计算实际的消耗,我们需要把OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS以及OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS的时间累计起来,前者表示数据字典表的相关的信息,包含权限控制等,后者表示sql所衍生出的递归sql语句的信息。可以看到绑定变量的,整条语句执行时间为0.22+0.02=0.24秒,CPU时间0.18+0.03=0.21秒,分析次数3次,执行次数1003次。而不绑定变量的时候,整条语句执行时间为0.28+1.29=1.57秒,CPU时间0.31+1.26=1.57秒,分析次数1002次,执行次数1003次。可见绑定变量的确能够带来更低的开销。(如何设计数据库中使用绑定变量也是和系统息息相关的,很多数据库问题都是在设计以后就已经存在的)

应用级调优分析:

就通常所说的三层架构来说,中间件这一层能够起到一个缓冲池的作用,如果并发用户数到3000这个数量级的时候,中间件能够控制不是所有的用户都能直接连接到数据库,当然这里的程序会快速响应用户请求,保证缓冲池的队列等待不会很久。

对应用这一级别的调优,主要集中在app程序,中间件的监控,集群配置等方面。如果是发现应用级别的问题,首先要分析是配置问题,还是程序本身的问题。如果并发用户数很大,中间件的线程池最大值配置过小,会导致在请求队列堆积,表现就是线程监控视图中,请求的队列堆积比较多,一般可以调整线程池最大值来解决。我们来看看weblogic的监控视图。

考虑到如果为每一个请求都创建一个新线程来处理的话,那么我们难以在系统中实现足够数量的线程。不受限制的创建线程可能耗尽系统资源,因此引入了线程池。线程池的思想是在进程开始时创建一定数量的线程并将它们置入一个池(pool)中,线程在这个池中等待工作。当服务器接收到一个请求时,它就从池中唤醒一个线程(如果有可用的线程),由它来处理请求。一旦线程服务完毕,它就返回线程池等待后面的工作。

线程池利用已存在的线程服务请求要比等待创建一个线程要快,并且线程池限制了线程的数量。

如果怀疑是程序的问题,我们一般可以通过java自带的工具来帮助分析,工具很多。这里我主要提到一个jdk1.6以后附带的jvisualvm。

我们打开jdk1.6,找到并运行jvisualvm.exe。

我们发现应用程序分为本地,远程两部分。本地包含本地运行的java进程,远程能够通过配置连接到远程服务器上的java进程。我们先启动一个tomcat。可以看到本地应用程序已经打开了一个带有tomcat以及进程标识id的菜单。双击打开。这里我们一般关心2个视图。监视、线程。

其中监视视图比较关心垃圾回收活动(顾名思义,回收那些在程序里面不再使用到的内存空间),堆内存变化。如果在压力测试过程中,堆内存变化是一个逐渐上涨的趋势,并且经过多次手动gc回收,还是保持这个趋势,说明内存泄漏的可能性很大。如果猜测有内存泄漏,可以通过分析java的heap mp。JVM (java虚拟机)记录下问题发生时系统的运行状态并将其存储在转储(mp)文件中。Heap mp就是这样一种文件形式。

线程视图比较关心线程的当前执行状态,这里可以生成另一种转储文件 Java mp。Java mp,也叫做 Thread mp,是 JVM 故障诊断中最重要的转储文件之一。JVM 的许多问题都可以使用这个文件进行诊断,其中比较典型的包括线程阻塞,CPU 使用率过高,JVM Crash,堆内存不足,和类装载等问题。其中线程阻塞更加常见。

原文转自:http://blog.csdn.net/xuyubotest/article/details/8158241

❿ oracle sql怎么写循环语句

declare
sql_tem Varchar2(4000);
a number;
b number;
i number;
begin
a := 1;
for i in 1 .. 3 loop
b := a + 4;
sql_tem := 'insert into A2 (ID,NAME) (select ID,NAME from A1 WHERE ROWNUM between :1 and :2)';

EXECUTE IMMEDIATE sql_tem
USING a, b;
commit;
a := a + 5;
end loop;
end;

试试上面的代码看一下能不能满意你的要求先呗。。。

热点内容
华硕访问点 发布:2025-02-06 15:56:57 浏览:330
excel拼接sql 发布:2025-02-06 15:50:10 浏览:500
加密手机直播 发布:2025-02-06 15:49:31 浏览:534
自带ftp服务器好用吗 发布:2025-02-06 15:26:11 浏览:109
win7访问xp局域网 发布:2025-02-06 15:17:07 浏览:524
均线差算法 发布:2025-02-06 15:13:22 浏览:459
androidbrowser 发布:2025-02-06 15:09:49 浏览:622
勇敢的心ftp 发布:2025-02-06 15:09:03 浏览:327
php日志分析 发布:2025-02-06 15:08:19 浏览:874
36脚本大厅作者 发布:2025-02-06 14:55:53 浏览:409