【问题标题】:Execute SQL from cursor value从游标值执行 SQL
【发布时间】:2019-01-20 10:13:46
【问题描述】:

(只是为了抢占先机 - 我知道这种方法有多么老套和有缺陷。这只是个人使用的东西,可以让某项任务更容易。)

对于这个例子,我想创建两个动态 SQL 插入语句,将 ALL_TABLES 的前两个结果插入 GT_DUMMY,并用输入值填充。

CREATE GLOBAL TEMPORARY TABLE GT_DUMMY
  ( Test_Field VARCHAR(100)
  );

CREATE OR REPLACE PROCEDURE LOAD_GT_DUMMY
  ( Insert_String VARCHAR
  )   
  IS      
  BEGIN

  FOR col IN
    ( SELECT 'INSERT INTO GT_DUMMY VALUES(' || CHR(39) || Insert_String || Table_Name || CHR(39) || ');' AS insertStatement
        FROM ALL_TABLES
       WHERE ROWNUM <= 2
    ) LOOP

    DBMS_OUTPUT.put_line(col.insertStatement);
    -- Result of EXEC LOAD_GT_DUMMY('SOMETHING'); :
    --     INSERT INTO GT_DUMMY VALUES('SOMETHINGDUAL');
    --     INSERT INTO GT_DUMMY VALUES('SOMETHINGSYSTEM_PRIVILEGE_MAP');

    -- This command fails when 
    EXECUTE IMMEDIATE col.insertStatement;

    END LOOP;

END;

插入格式正确,如果我单独运行它们就会执行,但是 EXECUTE IMMEDIATE col.insertStatement;命令不起作用。该程序可以编译,但是当我尝试运行时

EXEC LOAD_GT_DUMMY('SOMETHING');

我收到一个错误

ORA-00933: SQL command not properly ended
ORA-06512: at "MY_SCHEMA.LOAD_GT_DUMMY", line 14
ORA-06512: at line 1

有什么想法吗?我的语法关闭了吗?

最好的。

【问题讨论】:

    标签: oracle stored-procedures oracle11g dynamic-sql toad


    【解决方案1】:

    把sql语句中的冒号去掉,执行就行了

    FOR col IN
      ( SELECT 'INSERT INTO GT_DUMMY VALUES(' || CHR(39) || Insert_String || Table_Name || CHR(39) || ')' AS insertStatement
          FROM ALL_TABLES
         WHERE ROWNUM <= 2
      ) LOOP
    

    【讨论】:

      【解决方案2】:

      EXECUTE 语句的末尾尝试INTO v_result

      EXECUTE IMMEDIATE col.insertStatement INTO v_result;

      附:不要忘记声明v_result 变量

      你可以在here查看类似的例子

      【讨论】:

        【解决方案3】:

        去掉终止分号;动态 SQL 不喜欢。

        SELECT 'INSERT INTO GT_DUMMY VALU... <snip> ... || CHR(39) || ');' 
                                                                        ^
                                                                        |
                                                                       here
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-11
          • 1970-01-01
          • 1970-01-01
          • 2021-08-20
          • 2020-02-25
          相关资源
          最近更新 更多