【问题标题】:PL/SQL Procedure for a Table Column that contains SQL statement strings包含 SQL 语句字符串的表列的 PL/SQL 过程
【发布时间】:2015-12-05 16:14:44
【问题描述】:

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

我正在使用的表有一个ID 列,一个ITEM1ITEM2 列,以及一个SRC_CODE 列,其中包含例如。 (SELECT KEY FROM FACT_TABLE WHERE DAY_ID = V_DAY_ID AND some other condition)。因此,此过程必须在执行之前填充 V_DAY_ID 变量。将插入到新表中的值将是来自ITEM1ITEM2 列的值,以及来自SRC_CODE 列中的select 语句的关联KEYs(数千个结果)。我是 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;

【问题讨论】:

  • 使用“using”子句读取执行立即数以传入参数值。
  • 不需要光标:insert into key_metrics (key, item1, item2, cre_dt) select ...更加更有效率。此外,除了最后一个之外,您还抛出了来自 CUR_SRC_CODE 光标的所有结果。我很确定这也不是你想要的。
  • 感谢您的意见。如何在 insert into select 语句中处理来自execute immediate SRC_CODE 的结果集?我有数千个由 SRC_CODE 选择语句字符串产生的键,它们需要与 ITEM1ITEM2SRC_CODE 列成行的值相关联。
  • 你想如何将结果存储在V_KEY,逗号分隔值? (例如ID, SRC_CODE,ID, SRC_CODE,ID, SRC_CODE, .... etc)。
  • 我认为游标是最好的选择的原因是,我可以在循环执行时从 SRC_CODE 语句的执行中提取每个单独的 KEY,附加相应的 ITEM1ITEM2 值,然后将记录插入到目标表中。这不能与嵌套循环一起使用吗?

标签: oracle stored-procedures plsql dynamic-sql


【解决方案1】:

这正是我想要做的,感谢大家的提示:

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;

【讨论】:

    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2017-06-05
    相关资源
    最近更新 更多