批量收集和 ForAll - Oracle
Bulk Collect and ForAll - Oracle
我正在寻找从记录类型(按 table 索引)访问列的语法。下面是示例代码。我如何 运行 下面声明块中的更新脚本需要从 V_Emprec 记录类型中删除。我也创建了一个需要相同参数(empid)的过程。
这可以使用 %Rowtype 完成吗,或者我需要使用 emp_stage.empid%type 创建类型?
如果我为 Empid 和 Ename 创建 2 个类型 emp_stg.column_name%type,我可以使用它们来替换使用 Rowtype v_emprec 的插入脚本吗?
请告诉语法来做到这一点。
create table emp_master(empid number, ename varchar2(50));
create table emp_stage (empid number, ename varchar2(50));
create procedure update_emp_name(P_empid in emp_master.empid%type)
is
begin
Update emp_stage set ename =INITCAP(ename) WHERE EMPID =P_empid;
commit;
end;
Declare
Type emprec is table of emp_master%rowtype index by pls_integer;
v_emprec emprec;
Begin
Select empid,ename bulk collect into v_emprec from emp_master;
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
Update emp_stage set ename =INITCAP(ename) WHERE EMPID =v_emprec.empid(i);
/*Need Correct Syntax to use empid from the v_emprec type*/
update_emp_name();
commit;
End;
谢谢
您可以在一秒钟内完成更新 forall
,并像引用任何记录字段或 table 列一样引用记录字段;你只是在错误的地方有索引参考:
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
ForAll i in 1..v_emprec.count
Update emp_stage set ename = INITCAP(ename)
WHERE EMPID = v_emprec(i).empid;
您不能使用 forall
调用过程,它只允许 DML。不过,您可以使用普通的 for
循环:
for i in 1..v_emprec.count loop
update_emp_name(v_emprec(i).empid);
end loop;
但是由于它是逐行更新,并且会导致额外的上下文切换,因此效率会低于 forall
方法;或者实际上是所有行的一次更新。您还可以在执行插入之前循环收集并初始化字段:
for i in 1..v_emprec.count loop
v_emprec(i).ename := INITCAP(v_emprec(i).ename);
end loop;
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
或者更改插入以分别引用字段并在插入期间执行 initcap(这也不适用于 10g)。或者在查询中执行 initcap:
Select empid, INITCAP(ename) bulk collect into v_emprec from emp_master;
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
我正在寻找从记录类型(按 table 索引)访问列的语法。下面是示例代码。我如何 运行 下面声明块中的更新脚本需要从 V_Emprec 记录类型中删除。我也创建了一个需要相同参数(empid)的过程。
这可以使用 %Rowtype 完成吗,或者我需要使用 emp_stage.empid%type 创建类型? 如果我为 Empid 和 Ename 创建 2 个类型 emp_stg.column_name%type,我可以使用它们来替换使用 Rowtype v_emprec 的插入脚本吗?
请告诉语法来做到这一点。
create table emp_master(empid number, ename varchar2(50));
create table emp_stage (empid number, ename varchar2(50));
create procedure update_emp_name(P_empid in emp_master.empid%type)
is
begin
Update emp_stage set ename =INITCAP(ename) WHERE EMPID =P_empid;
commit;
end;
Declare
Type emprec is table of emp_master%rowtype index by pls_integer;
v_emprec emprec;
Begin
Select empid,ename bulk collect into v_emprec from emp_master;
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
Update emp_stage set ename =INITCAP(ename) WHERE EMPID =v_emprec.empid(i);
/*Need Correct Syntax to use empid from the v_emprec type*/
update_emp_name();
commit;
End;
谢谢
您可以在一秒钟内完成更新 forall
,并像引用任何记录字段或 table 列一样引用记录字段;你只是在错误的地方有索引参考:
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
ForAll i in 1..v_emprec.count
Update emp_stage set ename = INITCAP(ename)
WHERE EMPID = v_emprec(i).empid;
您不能使用 forall
调用过程,它只允许 DML。不过,您可以使用普通的 for
循环:
for i in 1..v_emprec.count loop
update_emp_name(v_emprec(i).empid);
end loop;
但是由于它是逐行更新,并且会导致额外的上下文切换,因此效率会低于 forall
方法;或者实际上是所有行的一次更新。您还可以在执行插入之前循环收集并初始化字段:
for i in 1..v_emprec.count loop
v_emprec(i).ename := INITCAP(v_emprec(i).ename);
end loop;
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);
或者更改插入以分别引用字段并在插入期间执行 initcap(这也不适用于 10g)。或者在查询中执行 initcap:
Select empid, INITCAP(ename) bulk collect into v_emprec from emp_master;
ForAll i in 1..v_emprec.count
Insert into emp_stage values v_emprec(i);