簡體   English   中英

批量收集和轉發-Oracle

[英]Bulk Collect and ForAll - Oracle

我正在尋找從記錄類型(按表索引)訪問列的語法。 下面是示例代碼。 我應該如何在下面的Declare塊中運行需要更新V_Emprec記錄類型的更新腳本。 我創建了一個proc,它也需要相同的parameter(empid)。

可以使用%Rowtype完成此操作,還是我需要使用emp_stage.empid%type創建類型? 如果我為Empid和Ename創建2個TYPES作為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進行更新,並像forall任何記錄字段或表列一樣引用記錄字段; 您只是將索引引用放在錯誤的位置:

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方法效率低; 或實際上是所有行的一次更新。 您還可以在執行插入操作之前,在集合周圍循環並使用initcap字段:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM