Oracle11g 90000000“无效SQL语句”用于立即执行

Oracle11g 90000000“无效SQL语句”用于立即执行,oracle11g,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

我试图在下面的代码中使用动态查询,但得到错误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;

我认为你做得太过分了;可以在不使用INSERT语句和PL/SQL的情况下运行INSERT语句和PL/SQL,如:

begin 
for i in 1..10 loop
   insert into test (some_column) values (to_char(i));
end loop;
end;
但无论如何,看起来您最后一次执行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;';

我认为你做得太过分了;可以在不使用INSERT语句和PL/SQL的情况下运行INSERT语句和PL/SQL,如:

begin 
for i in 1..10 loop
   insert into test (some_column) values (to_char(i));
end loop;
end;
但无论如何,看起来您最后一次执行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;';

非常感谢patrick marchand的建议。我用begin和end尝试了我的代码。它工作了,但没有生成所需的o/p。我想打印全局临时数据。实际上,我的任务是在SP内部动态创建GTT,因此需要动态SQL的帮助。我只想做一个测试,使用上面的FOR循环打印所有表数据,但是数据没有显示在op中,但是脚本运行成功。我请求您建议如何使用Execute Immediate打印表格数据。实际上,出于学习目的,我正在进行此测试,其中我尝试从SP 1创建GTT 2将数据从现有视图插入GTT 3打印所有GTT数据。4删除GTT,因为我的SP将执行DLL,因此一切都将是动态的…请建议id仍然可以在SP内以更好的方式运行DLL。谢谢,即使我在下面的动态字符串中添加了一些子句,我也会收到错误PLS-00103,请建议代码中的错误。printTableValues:='BEGIN for data inSELECT*from my_temp_table,其中LOC='I'循环dbms_output.put_linedata.ID;端环;"完";;立即执行PrintTableValue;您好@patrickmarchand,代码正在按预期工作。这是我在逻辑上的错误。感谢您,我请求您帮助我理解为什么在使用以下printTableValues:='BEGIN for data inSELECT*子句时出现错误,其中LOC='I'循环dbms\u output.put\u linedata.ID;端环;"完";;立即执行PrintTableValue@PS078如果你想在文本字符串中嵌入像WHERE LOC='I'这样的东西,你需要在I周围加上两个单引号。因此,不要用'BEGIN….WHERE LOC='I'。。。结束;'您需要将其设置为“开始…”,其中LOC=I。。。结束;'常量前后有两个连续的单引号。非常感谢@patrick marchand的建议。我用begin和end尝试了我的代码。它工作了,但没有生成所需的o/p。我想打印全局临时数据。实际上,我的任务是在SP内部动态创建GTT,因此需要动态SQL的帮助。我只想做一个测试,使用上面的FOR循环打印所有表数据,但是数据没有显示在op中,但是脚本运行成功。我请求您建议如何使用Execute Immediate打印表格数据。实际上,出于学习目的,我正在进行此测试,其中我尝试从SP 1创建GTT 2将数据从现有视图插入GTT 3打印所有GTT数据。4删除GTT,因为我的SP将执行DLL,因此一切都将是动态的…请建议id仍然可以在SP内以更好的方式运行DLL。谢谢,即使我在下面的动态字符串中添加了一些子句,我也会收到错误PLS-00103,请建议代码中的错误。printTableValues:='BEGIN for data inSELECT*from my_temp_table,其中LOC='I'循环dbms_output.put_linedata.ID;端环;"完";;立即执行PrintTableValue;您好@patrickmarchand,代码正在按预期工作。这是我在逻辑上的错误。感谢您,我请求您帮助我理解为什么在使用以下printTableValues:='BEGIN for data inSELECT*子句时出现错误,其中LOC='I'循环dbms\u output.put\u linedata.ID;端环;"完";;立即执行PrintTableValue@PS078如果你想在文本字符串中嵌入像WHERE LOC='I'这样的东西,你需要在I周围加上两个单引号。因此,不要用'BEGIN….WHERE LOC='I'。。。结束;'您需要将其设置为“开始…”,其中LOC=I。。。结束;'有两个 常量前后的连续单引号。