0

ソース表からデータを取得してターゲット表に挿入するPL/SQLプロシージャを作成する必要があります。ソース表には、ITEM1列、ITEM2列、および列がありSRC_CODEます。SRC_CODE列には、SQL Select ステートメントである文字列が含まれていますSELECT KEY FROM SOMETABLE WHERE DAY = V_DAY。したがって、どうにかしてSRC_CODE列内のステートメントを実行しV_DAY、select ステートメント内にその変数を設定する必要があります。結果のKEY値は、ソース テーブルと共に、ITEM1およびITEM2ソース テーブルからテーブルに入りTARGETます。

プロセスに論理的にアプローチすると、ソース テーブルから行を取得SRC_CODEし、コレクションに実行する必要があることがわかります。次に、コレクションからそれぞれを取得し、それをandKEYに結び付けて、 、、およびをターゲット テーブルに挿入します。プログラミングの観点からこれを行う方法がわかりません。ITEM1ITEM2KEYITEMITEM2

以下は、少なくともターゲットにキー値を入力しようとする私の試みですが、無効な識別子エラーが発生したため、役に立ちませんでした。誰かが私が必要とするものを得るためにこれを修正/拡張できるなら、それは大歓迎です:

CREATE OR REPLACE PROCEDURE POPULATETARGET IS
TYPE KEYS_T IS TABLE OF SOMETABLE.KEY%TYPE;
L_KEYS KEYS_T;
V_DAY NUMBER;
SRC_CODE_FETCH VARCHAR2(200);
V_SRC_CODE VARCHAR2 (4000);
RC SYS_REFCURSOR;

BEGIN
V_DAY := 20150826;
SRC_CODE_FETCH := 'SELECT SRC_CODE FROM SOURCE';

OPEN RC FOR SRC_CODE_FETCH;
    LOOP
        FETCH RC INTO V_SRC_CODE;
        EXIT WHEN RC%NOTFOUND;
            EXECUTE IMMEDIATE V_SRC_CODE BULK COLLECT INTO L_KEYS USING V_DAY;
            FORALL x IN L_KEYS.FIRST..L_KEYS.LAST
                INSERT INTO TARGET VALUES L_KEYS(x);   
    END LOOP;
    CLOSE RC;   
END;
4

2 に答える 2

0

問題は、挿入ステートメントに括弧がないことです。そのため、挿入行は次のようになります。

INSERT INTO TARGET VALUES (L_KEYS(x)); 

COMMITまた、この行の後に使用することをお勧めします。

于 2015-09-11T18:19:31.617 に答える
0

これは完璧に機能しました:

CREATE OR REPLACE PROCEDURE POPULATETARGET IS   
    TYPE KEYS_T IS TABLE OF SOMETABLE.KEY%TYPE;
    L_KEYS KEYS_T;
    V_DAY NUMBER;
    V_SRC_CODE VARCHAR2 (4000);
    RC SYS_REFCURSOR;

BEGIN
    VDAY_ID := 20150826;

    OPEN RC FOR SELECT SRC_CODE FROM SOURCE;
    LOOP
        FETCH RC INTO V_SRC_CODE;
        EXIT WHEN RC%NOTFOUND;
            EXECUTE IMMEDIATE V_SRC_CODE BULK COLLECT INTO L_KEYS USING V_DAY;
            FORALL x IN L_KEYS.FIRST..L_KEYS.LAST
                INSERT INTO TARGET (KEY, ITEM1, ITEM2) 
                VALUES((L_KEYS(x)), (SELECT ITEM1 FROM SOURCETBL WHERE SRC_CODE = V_SRC_CODE), (SELECT ITEM2 FROM SOURCETBL WHERE SRC_CODE = V_SRC_CODE));
                COMMIT;
    END LOOP;
    CLOSE RC;   
END;
于 2015-09-11T20:55:51.333 に答える