00900. 00000 - EXECUTE IMMEDIATE的“无效SQL语句”

时间:2016-03-12 15:30:08

标签: oracle11g

我正在尝试在下面的代码中使用动态查询但是收到错误(00900. 00000 - “无效的SQL语句”)。请建议我在代码中的错误。

create or replace PROCEDURE CreateInsertTmpTable
AS
crttmp VARCHAR2(200);
intrtmp VARCHAR2(200);
printTableValues VARCHAR2(1000);

BEGIN
  crttmp := 'CREATE GLOBAL TEMPORARY TABLE my_temp_table ON COMMIT PRESERVE ROWS AS SELECT * FROM VWBLKDATA WHERE 1=0';
  EXECUTE IMMEDIATE crttmp;
  intrtmp := 'INSERT INTO my_temp_table SELECT * FROM VWBLKDATA';
  EXECUTE IMMEDIATE intrtmp;
  printTableValues := ' for data in(SELECT * from my_temp_table)
                        loop
                             dbms_output.put_line(data.ID); 
                        end loop';
  EXECUTE IMMEDIATE printTableValues;
  COMMIT;
END CreateInsertTmpTable;

1 个答案:

答案 0 :(得分:1)

我认为你过度执行了EXECUTE IMMEDIATE;你可以运行INSERT语句和没有它们的PL / SQL,如:

begin 
for i in 1..10 loop
   insert into test (some_column) values (to_char(i));
end loop;
end;

但无论如何,它看起来像你最后的EXECUTE IMMEDIATE正在尝试执行部分PL / SQL匿名块;它错过了一个"开始"和"结束;"

我建议只执行for循环:

for data in (SELECT * from my_temp_table) 
loop
      dbms_output.put_line(data.ID); 
end loop;

或者您需要在文本中添加一个开头/结尾("结束循环"需要尾随&#34 ;;"):

printTableValues := 'begin 
                        for data in (SELECT * from my_temp_table)
                        loop
                             dbms_output.put_line(data.ID); 
                        end loop;
                     end;';