2016-04-26 53 views
0

我正在尋找從記錄類型(索引表)訪問列的語法。以下是示例代碼。我該如何在V_Emprec記錄類型中運行需要empid的Declare塊下面的Update腳本。我創建了一個需要相同參數(empid)的proc。批量收集和ForAll - Oracle

這可以使用%Rowtype來完成,或者我需要使用emp_stage.empid%type來創建類型嗎? 如果我創建Empid和Ename的2個類型爲emp_stg.column_name%類型,我可以使用這些來替換使用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; 

感謝

+0

我只是在學習如何使用Type來插入和更新的語法,所以請忽略邏輯。無論如何,我測試的代碼和插入工作正常。沒有真正理解你的第二點。 – Abhi

回答

0

你可以在第二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); 
+0

如果我使用v_emprec(i).empid,我會得到PLS-00436:實施限制錯誤。不知道我們是否可以通過表記錄從索引訪問列。我正在使用Oracle 10g。 – Abhi

+0

正確;它在11g中工作(將流浪的'(i)'從簡單循環計數中移除)。在10g中,您可以使用過程版本。或者跳過更新並使用插入,首先更改記錄字段值。 –