Oracle11g 90000000“无效SQL语句”用于立即执行
我试图在下面的代码中使用动态查询,但得到错误00900。00000-无效的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
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。。。结束;'有两个 常量前后的连续单引号。