表的PL / SQL过程包含SQL语句字符串的列

时间:2015-09-09 15:39:20

标签: oracle stored-procedures plsql dynamic-sql

我的任务是构建一个过程,该过程根据另一个值中的值将值插入到新表中,包括包含不同SELECT语句的字符串的列。

我正在使用的表格包含ID列,ITEM1ITEM2列以及包含SRC_CODE列的(SELECT KEY FROM FACT_TABLE WHERE DAY_ID = V_DAY_ID AND some other condition)列。 ITEM1。因此,此过程必须在执行之前填充V_DAY_ID变量。将插入到新表中的值将是来自ITEM2KEY列的值,以及来自{中的select语句的关联SRC_CODE s(数千个结果) {1}}列。在谈到PL / SQL时,我是一个新手,所以我有点失去构建这个过程。

这就是我所说的,即使它不正确,它应该让你知道我想要完成的事情:

CREATE OR REPLACE PROCEDURE METRICS (DAY_ID IN NUMBER)
IS
    CURSOR CUR_ITEMS IS
        SELECT ID, ITEM1, ITEM2 FROM METRICSTABLE;

    CURSOR CUR_SRC_CODE IS
        SELECT ID, SRC_CODE FROM METRICSTABLE;

    VDAY_ID NUMBER;
    V_KEY INTEGER;

BEGIN
VDAY_ID := DAY_ID;


FOR i IN CUR_SRC_CODE LOOP
    EXECUTE IMMEDIATE SRC_CODE INTO V_KEY;
END LOOP;    

FOR REC IN CUR_ITEM LOOP
    INSERT INTO KEY_METRICS (KEY, ITEM1, ITEM2, CRE_DT) 
                                  VALUES (V_KEY, ITEM1, ITEM2, SYSDATE);
    COMMIT;
END LOOP;

END;

1 个答案:

答案 0 :(得分: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
    V_DAY := 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;