如何使用包含需要执行的SQL语句字符串的表列?

时间:2015-09-11 17:19:49

标签: oracle stored-procedures plsql dynamic-sql execute-immediate

我需要构建一个PL / SQL过程,该过程从源表中获取数据并将其插入到目标表中。源表格包含ITEM1列,ITEM2列和SRC_CODE列。 SRC_CODE列包含一个SQL Select语句的字符串,即SELECT KEY FROM SOMETABLE WHERE DAY = V_DAY。所以,我不知何故需要在SRC_CODE列中执行语句并在select语句中填充V_DAY变量。生成的KEY值以及源表中的ITEM1ITEM2将进入TARGET表。

逻辑上接近过程,我收集我需要从源表中取一行,将SRC_CODE执行到集合中,然后从集合中取出每个KEY并将其绑定到{ {1}}和ITEM1并将ITEM2KEYITEM插入目标表。我不知道如何在编程方面解决这个问题。

以下是我尝试至少使用键值填充目标,但无效,因为我收到无效的标识符错误。如果有人可以纠正/扩展这个以获得我需要的东西,那将非常感激:

ITEM2

2 个答案:

答案 0 :(得分:0)

问题是你在insert语句中缺少括号,所以你的插入行应该是:

INSERT INTO TARGET VALUES (L_KEYS(x)); 

另外,我建议您在此行之后使用COMMIT

答案 1 :(得分: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;