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

Posted

技术标签:

【中文标题】立即执行时出现无效字符错误【英文标题】:invalid character error while executing immediate 【发布时间】:2014-02-18 12:23:01 【问题描述】:
BEGIN    
    exception
         when others then
    sqltext2:='insert into ERROR_TABLE_SHREE select '||str||' from dual;';
    EXECUTE IMMEDIATE sqltext2;
    end;
    COMMIT;

我在异常块中收到以下错误

ORA-00911: invalid character

【问题讨论】:

您提供的代码没有给出这个错误。但是:PLS-00103:在预期以下情况之一时遇到符号“例外”。该代码没有声明您使用的变量。 PL/SQL 语句必须以斜杠结尾。 sqltext2 字符串以 ; 结尾 【参考方案1】:

那里没有字符串(我假设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 中执行错误记录会更正常

【讨论】:

【参考方案2】:

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

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

我希望您并没有真正开始使用WHEN OTHERS 异常处理程序。我希望您有正当理由在这里使用动态 SQL,因为我没有看到动态 SQL。

【讨论】:

我想添加我的完整代码。但网站不允许这样做。

以上是关于立即执行时出现无效字符错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误

通过 JTDS 驱动程序执行 SQL Server 调用时出现“第 24 行位置的 JDBC 转义语法无效 '=' 预期字符”错误的原因?

通过 UCanAccess 插入时出现“强制转换的字符值无效”错误

执行“eb local run”时出现“注册表配置无效”错误

执行查询时出现“选择列表中的列名无效”错误

sql server在执行批处理时出现错误。错误消息为: 目录名无效