0

我需要构建一个 PL/SQL 过程,该过程从源表中获取数据并将其插入到目标表中。源表具有一ITEM1列、一ITEM2列和一SRC_CODE列。该SRC_CODE列包含一个作为 SQL 选择语句的字符串,即SELECT KEY FROM SOMETABLE WHERE DAY = V_DAY. 因此,我需要以某种方式执行列中的语句并在 select 语句中SRC_CODE填充该变量。V_DAY结果KEY值以及ITEM1ITEM2表中的值将进入TARGET表中。

从逻辑上接近这个过程,我认为我需要从源表中取出一行,执行SRC_CODE到一个集合中,然后KEY从集合中取出每个并将其绑定到ITEM1andITEM2和 insert KEY, ITEM, andITEM2到目标表中。我不知道如何在编程方面解决这个问题。

以下是我尝试至少用键值填充目标,但无济于事,因为我收到了无效的标识符错误。如果有人可以对此进行更正/扩展以获得我需要的东西,将不胜感激:

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

这工作完美:

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 回答
0

问题是您在插入语句中缺少括号,因此您的插入行应该是:

INSERT INTO TARGET VALUES (L_KEYS(x)); 

我还建议您COMMIT在此行之后使用。

于 2015-09-11T18:19:31.617 回答