立即执行时出现无效字符错误
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 插入时出现“强制转换的字符值无效”错误