2016-03-12 89 views
0

我想在下面的代码中使用动态查询,但出现错误(00900. 00000 - “invalid SQL statement”)。请提出我在代码中错误的地方。00900. 00000 - “无效的SQL语句”EXECUTE IMMEDIATE

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

我认为你过度执行立即;您可以运行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; 

,否则你将需要添加一个开始/在文本周围端(和“结束循环”需要一个尾随“ ;“):

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

非常感谢@patrick marchand的建议。我尝试了我的代码与开始和结束..它工作,但期望的O/P没有生成(即我想打印全局临时数据)。实际上,我的任务是在SP内部创建GTT,从而借助Dynamic SQL。我只想做一个测试,使用上面的FOR循环打印所有的表格数据,但是数据不会显示在操作中,但脚本成功运行。我请你建议如何使用执行立即打印表格数据。 – PS078

+0

实际上,为了学习的目的,我正在做这个测试,其中我试图实现以下事情从SP 1)创建GTT 2)从现有的视图中插入数据到GTT 3)打印所有的GTT数据。 4)DROP GTT 由于我的SP将执行一个DLL,因此一切都将是动态....请建议ID仍然可以更好的方式在SP内运行DLL。谢谢 – PS078

+0

甚至当我在下面的动态字符串中添加一些子句时,出现错误(PLS-00103),请提示代码中出现了什么问题。 printTableValues:'BEGIN (SELECT * from my_temp_table WHERE LOC ='I') loop dbms_output.put_line(data.ID); end loop; END;'; EXECUTE IMMEDIATE printTableValues; – PS078

相关问题