我正在尝试在下面的代码中使用动态查询但是收到错误(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;
答案 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;';