2016-04-26 14 views
0

レコード型(索引別)の列にアクセスする構文を探しています。以下はサンプルコードです。 V_Emprecレコードタイプからempidが必要なDeclareブロックのUpdateスクリプトをどのように実行すればいいですか?私は同じパラメータ(empid)を必要とするprocを作成しました。一括収集とForAll - Oracle

これは%Rowtypeを使用して行うことができますか、emp_stage.empid%typeを使用して型を作成する必要がありますか? Empidの2つのTYPESを作成し、emp_stg.column_name%typeとしてEnameを使用している場合、これらを使用してRowtype v_emprecを使用してInsertスクリプトを置き換えることはできますか?

これを行うには構文を教えてください。

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を挿入と更新に使用する方法を知るための構文を覚えていますので、ロジックを無視してください。とにかく、コードをテストして、Insertが正常に動作しています。あなたの2番目のポイントを本当に理解していない。 – 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; 

あなたはそれが唯一のDMLを可能にする、forallでプロシージャを呼び出すことはできません。あなたはしかし、通常のforループを使用することができます

for i in 1..v_emprec.count loop   
    update_emp_name(v_emprec(i).empid); 
end loop; 

をしかし、それは、単一の行ごとの更新を行い、余分なコンテキストスイッチを負うとして、それはforallアプローチよりも効率になります。実際にはすべての行を1回更新するだけです。 (また、10グラムでは動作しません)、挿入時に

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を行うには、インサートを変更する:あなたがすることもでき、挿入を行う前に、コレクションの周りやフィールドINITCAPループ。または、クエリの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

PLS-00436:v_emprec(i).empidを使用すると実装制限エラーが発生します。テーブルレコードごとにインデックスから列にアクセスできるかどうかは不明です。私はOracle 10gを使用しています。 – Abhi

+0

右これは11gで動作します(単純なループカウントから除外された '(i) 'で)。 10gでは、プロシージャのバージョンを使用できます。または、更新をスキップして、レコードフィールド値を最初に変更して挿入を使用するだけです。 –

関連する問題