【问题标题】:How do I work with a table column that contains SQL statement strings that need to be executed?如何处理包含需要执行的 SQL 语句字符串的表列?
【发布时间】:2015-09-11 17:19:48
【问题描述】:

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

从逻辑上接近这个过程,我认为我需要从源表中获取一行,将SRC_CODE 执行到一个集合中,然后从集合中获取每个KEY 并将其绑定回ITEM1 和@ 987654335@ 并将KEYITEMITEM2 插入到目标表中。我不知道在编程方面如何去做。

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

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;

【问题讨论】:

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


    【解决方案1】:

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

    INSERT INTO TARGET VALUES (L_KEYS(x)); 
    

    另外我建议你在这行之后使用COMMIT

    【讨论】:

      【解决方案2】:

      这很完美:

      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-12-05
        • 2014-10-23
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        • 2019-08-24
        相关资源
        最近更新 更多