从游标值执行SQL

时间:2018-08-13 16:03:55

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

(只是要抢占一席之地-我知道这种方法是多么的骇人听闻和有缺陷。为了简化某些任务,这将是一种个人使用的东西。)

对于此示例,我想创建两个动态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

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

最好。

3 个答案:

答案 0 :(得分:3)

删除终止的分号;动态SQL不喜欢它。

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

答案 1 :(得分:1)

INTO v_result语句的结尾处尝试使用EXECUTE

EXECUTE IMMEDIATE col.insertStatement INTO v_result;

P.S。不要忘记声明v_result变量

您可以在here下查看类似的示例

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