0

レコード タイプ (テーブルごとのインデックス) から列にアクセスするための構文を探しています。以下はサンプルコードです。V_Emprec レコード タイプから empid を必要とする Declare ブロックの下で Update スクリプトを実行するにはどうすればよいですか。同じパラメーター(empid)が必要なprocも作成しました。

これは %Rowtype を使用して行うことができますか、それとも emp_stage.empid%type で型を作成する必要がありますか? Empid と Ename の 2 つの TYPE を 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;

ありがとう

4

1 に答える 1

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アプローチよりも効率的ではありません。または実際にはすべての行の単一の更新。挿入を行う前に、コレクションをループしてフィールドを初期化することもできます。

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);
于 2016-04-26T22:38:47.240 に答える