执行立即时出现无效字符错误

时间:2014-02-18 12:23:02

标签: oracle plsql oracle11g oracle10g

BEGIN    
    exception
         when others then
    sqltext2:='insert into ERROR_TABLE_SHREE select '||str||' from dual;';
    EXECUTE IMMEDIATE sqltext2;
    end;
    COMMIT;

我在异常阻止

中遇到以下错误
ORA-00911: invalid character

2 个答案:

答案 0 :(得分:5)

你没有字符串(我假设str被声明为某些描述的字符)。如果你想插入一个字符串,你需要额外的引号,否则它将在这个实例中被解释为一个列。类似的东西:

begin
   ...
exception
   when others then
     sqltext2 := 'insert into error_table_shree select '''||str||''' from dual';
     execute immediate sqltext2;
end;
commit;

请注意我已从字符串末尾删除了分号;这不是必需的(可能是您错误的实际原因)。

值得注意的是,这有点SQL-injectiony ...你应该使用bind variables而不是连接;这都在the documentation中描述:

begin
   ...
exception
   when others then
     execute immediate 'insert into error_table_shree select :1 from dual' 
                  using str;
end;
commit;

但是,在此上下文中不需要使用动态SQL;你可以简单地插入变量值:

begin
   ...
exception
   when others then
     insert into error_table_shree values (str);
end;
commit;

最后,我稍微关注你的COMMIT;以这种方式处理错误后提交是不常见的。如果没有更多的上下文,就无法确定,但在autonomous transaction

中执行错误记录更为正常

答案 1 :(得分:0)

您不希望在构建的字符串中使用分号并传递给EXECUTE IMMEDIATE。

sqltext2:='insert into ERROR_TABLE_SHREE select '||str||' from dual';

我希望您没有真正使用WHEN OTHERS异常处理程序启动块。我希望你有充分的理由在这里使用动态SQL,因为我没有看到它。