2016-04-26 65 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中,您可以使用过程版本。或者跳过更新并使用插入,首先更改记录字段值。 –