2017-09-12 14 views
0

FORALL INSERTステートメント(一括挿入)からRETURNING句を使用してレコードのROWIDを取得したいと思います。 私は、この問題は、FORALLとBULK COLLECTのレコードのテーブルを一緒に使用することにあると考えています。 FORALLとRETURNINGを使用してテーブルに挿入するときにROWIDを取得する方法

は、例を参照してください:

CREATE TABLE test2 (num NUMBER); 
set serveroutput on 

DECLARE 
    TYPE r_rec IS RECORD (num NUMBER, row_id ROWID); 
-- TYPE t_rid IS TABLE OF rowid INDEX BY BINARY_INTEGER; 
    TYPE t_tab IS TABLE OF r_rec INDEX BY BINARY_INTEGER; 
    v_tab  t_tab; 
    --v_rid  t_rid; 
BEGIN 
    v_tab(1).num := 1.11; 
    v_tab(2).num := 2.22; 
    v_tab(3).num := 3.33; 
    -- 
    FORALL i IN v_tab.first..v_tab.last 
    INSERT INTO test2 (num) 
    VALUES (v_tab(i).num) 
    RETURNING rowid BULK COLLECT INTO v_tab(i).row_id 
    ; 
    FOR i IN v_tab.first..v_tab.last 
    LOOP 
    dbms_output.put_line('num/rowid : ' || v_tab(i).num || '/' || v_tab(i).row_id); 
    END LOOP; 
END; 
/

それが提起エラー:PLS-00437:バルクインデックスFORALL句問題はここにある を返すに使用することはできませんか? ROWIDを戻すために別のPL/SQL表が必要ですか?

+0

まあそのレコードが挿入されるときに、レコードにROWIDが割り当てられます。それをRETURNING節で得ることができます。私はそれをPL/SQLテーブル+レコードに戻す必要があります。この例を参照してください。私の質問はそれに関連しています。 – LiborStefek

答えて

2

Do I need another PL/SQL table for returning ROWIDs?

はい ..Youは、以下のようにそれを試すことができます:あなたは、「FORALLバルクインデックスは、RETURNING句で使用することはできません」ので、ROWIDのリターンを保持するために別のコレクションが必要になり

DECLARE 
    TYPE r_rec IS RECORD (num NUMBER, row_id ROWID); 

    TYPE t_tab IS TABLE OF r_rec INDEX BY BINARY_INTEGER; 
    v_tab  t_tab; 

    TYPE r_rw IS TABLE OF ROWID index by pls_integer; 

    v_rw r_rw; 

BEGIN 
    v_tab(1).num := 1.11; 

    v_tab(2).num := 2.22; 

    v_tab(3).num := 3.33; 

    -- 
    FORALL i IN v_tab.first..v_tab.last 
    INSERT INTO test2 (num) 
    VALUES (v_tab(i).num) 
    RETURNING rowid BULK COLLECT INTO v_rw; 

    FOR i IN v_tab.first..v_tab.last 
    LOOP 
    dbms_output.put_line('num/rowid : ' || v_tab(i).num || '/' ||v_rw(i)); 
    END LOOP; 

END; 
/
+0

残念ながら、これは、 'v_rw'のインデックスが' v_tab'のインデックスと同じものであることが保証されていないので、少し壊れやすい解決策です。しかし、それは可能な解決策のように見えます。 – LiborStefek

+0

@ LiborStefek。これは 'v_tab'のループで実行されているので、使用されているインデックスが正しいことを確認できます。 http://www.dba-oracle.com/plsql/t_plsql_dml.htmを参照してください。また、これがあなたの質問に答えた場合は、解決策を受け入れることによって問題を閉じることができます。 – XING

+0

'v_tab(1).num:= 1.11;を' v_tab(4).num:= 1.11; 'に変更してください。 'i'のインデックスは2,3,4ですが、' v_rw'のインデックスは1,2,3となります。これは私が「壊れやすい」という意味です。私はそれを考慮する必要があります。 – LiborStefek

関連する問題