select SUM(ABCD.COUNTRY_CODE) from AB_SRP_DETAILS_ALL ABCD
where rownum <= 1
当COUNTRY_CODE列是varchar2列时,是INVALID,但使用execute immediate触发时相同的查询是有效的
答案 0 :(得分:6)
使用更简单(但不合逻辑)的查询:
select sum(dummy) from dual;
Error report -
ORA-01722: invalid number
begin
execute immediate 'select sum(dummy) from dual';
end;
/
PL/SQL procedure successfully completed.
那么为什么第一个语句会抛出错误,但第二个语句不会抛出错误?
如果 dynamic_sql_statement 是
SELECT
语句,并且您省略 into_clause 和 bulk_collect_into_clause ,那么 execute_immediate_statement 永远不会执行。
我的PL / SQL块中的execute immediate
没有into
子句,因此查询不会被执行,因为它没有被执行,所以它不会生成异常。查询语句仍然是解析,因此如果语法无效,则会看到错误;但ORA-01722是查询执行时抛出的运行时错误,而不是在解析期间。
稍微更现实的PL / SQL版本会引发同样的错误:
declare
result number;
begin
execute immediate 'select sum(dummy) from dual' into result;
end;
/
Error report -
ORA-01722: invalid number
ORA-06512: at line 4
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.