oracle存储过程遍历
① Oracle 并行循环执行存储过程语句
在处理大数据量的插入操作时,直接使用存储过程进行逐条插入效率较低。为提高性能,可以利用Oracle的并行执行特性。具体方法是将需要插入的数据通过UNION ALL进行合并,然后使用带有并行指示的INSERT语句一次性插入。例如:
插入语句可以写成:
insert /*+ parallel(tablename, 3) */ into tablename select * from table1 union all select * from table2 union all select * from table3
这里的parallel(tablename, 3)表示将tablename表的插入操作并行执行,同时执行的线程数为3。通过这种方式,可以显着提升数据插入的速度。
需要注意的是,并行执行并非适用于所有场景。在某些情况下,如表结构复杂、索引较多或数据量较小的情况下,使用并行执行可能并不会带来明显的性能提升,甚至可能降低效率。
此外,合理设置并行度也很重要。过高的并行度可能导致资源竞争加剧,反而影响性能。因此,在实际应用中,需要根据具体情况进行测试和调整。
总之,通过合理利用Oracle的并行执行特性,可以有效提升存储过程中的数据插入效率,特别是在处理大数据量场景时。
② oracle 存储过程循环执行update语句
其实二楼写的最简单,但对于新手,最好别那么写,至于1楼,如果数据不是很多,没必要搞个游标。你也可以看看我写的
create or replace procere P_Update(o_vc_message out varchar2)
is
type column1 is table of table1.column1%type index by binary_integer;
col1s column1;
type rid is table of rowid index by binary_integer;
rids rid;
temp table1.column1%type;
begin
select column1,rowid bulk collect into col1s,rids from table1;
if (column1.count != 0) then
for i in col1s.first..col1s.last loop
temp := col1s(i);--处理 col1s(i) 想干嘛干嘛
update table1 set column1 = temp where rowid = rids(i);
end loop;
end if;
o_vc_message := 'OK!';
exception
when others then
o_vc_message := 'exception happend.' || sqlcode || sqlerrm;
rollback;
return;
end P_Update;
如果仅仅是简单处理column1,比如加1什么的,就别搞那么复杂,一个sql就ok了。
③ oracle存储过程循环怎么写
Oracle中有三种循环(For、While、Loop):
1、loop循环:
createorreplaceprocerepro_test_loopis
inumber;
begin
i:=0;
loop
i:=i+1;
dbms_output.put_line(i);
ifi>5then
exit;
endif;
endloop;
endpro_test_loop;
2、while循环:
createorreplaceprocerepro_test_loopis
inumber;
begin
i:=0;
whilei<5loop
i:=i+1;
dbms_output.put_line(i);
endloop;
endpro_test_loop;
3、for循环1:
createorreplaceprocerepro_test_foris
inumber;
begin
i:=0;
foriin1..5loop
dbms_output.put_line(i);
endloop;
endpro_test_for;
4、for循环2:
createorreplaceprocerepro_test_cursoris
userRowt_user%rowtype;
cursoruserRowsis
select*fromt_user;
begin
foruserRowinuserRowsloop
dbms_output.put_line(userRow.Id||','||userRow.Name||','||userRows%rowcount);
endloop;
endpro_test_cursor;
④ 关于oracle 存储过程 如何切割一个字符串 转化为字符数组,然后遍历该数组: 类似ab,12;cd,55;k,7
给你写了个包,包体代码如下:
CREATE OR REPLACE PACKAGE BODY Pkg_Bai IS
-- 自定义个数组类型
TYPE Typ_Str_Array IS TABLE OF VARCHAR2(200) INDEX BY BINARY_INTEGER;
PROCEDURE Prc_String_To_Array(Pv_i_String IN VARCHAR2,
Pv_i_Identifier IN VARCHAR2,
Pt_o_Array OUT Typ_Str_Array) IS
Lv_Tmpstr VARCHAR2(200);
Lv_Changed_String VARCHAR2(4000);
BEGIN
-- 初始化
Lv_Changed_String := Pv_i_String;
-- 拆分逻辑
-- 1.字符串中没有标识符
IF Instr(Pv_i_String, Pv_i_Identifier, 1, 1) = 0 THEN
Pt_o_Array(Pt_o_Array.Count + 1) := Pv_i_String;
ELSE
-- 2.字符串中有标识符
WHILE Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) > 0 LOOP
Lv_Tmpstr := Substr(Lv_Changed_String,
1,
Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) - 1);
Pt_o_Array(Pt_o_Array.Count + 1) := Lv_Tmpstr;
Lv_Changed_String := Substr(Lv_Changed_String,
Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) + 1,
Length(Lv_Changed_String));
END LOOP;
-- 3.最有一个被拆分出来的字符串中不含标识符
IF NOT Lv_Changed_String IS NULL THEN
-- 将最后一个保存
Pt_o_Array(Pt_o_Array.Count + 1) := Lv_Changed_String;
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
PROCEDURE Prc_Test(Pv_i_Str IN VARCHAR2) IS
--定义数组
Lt_Array Typ_Str_Array;
Ln_Count NUMBER; -- 数组元素个数
Ln_Num NUMBER;
Lv_Value VARCHAR2(30);
BEGIN
Prc_String_To_Array(Pv_i_Str, ';', Lt_Array);
-- 循环数组
FOR i IN 1 .. Lt_Array.Count LOOP
-- 获取每个元素中数值
Ln_Num := To_Number(TRIM(Substr(Lt_Array(i), Instr(Lt_Array(i), ',', -1) + 1)));
IF Ln_Num > 20 THEN
Lv_Value := TRIM(Substr(Lt_Array(i), 1, Instr(Lt_Array(i), ',', -1) - 1));
INSERT INTO a (col_a) VALUES (lv_value);
END IF;
END LOOP;
END;
END Pkg_Bai;
调用Prc_Test来分隔字符串并按要求比较后插入a表。我测试过,没有问题。
需要注意的是,数据的要求:字符串中每组数据间使用英文小写分号分隔,同一组数据字母在前,数字在后,以英文小写逗号分隔。测试一下吧。
欢迎采纳,不采纳你都对不起我这20分钟。呵呵......
⑤ Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中