select from dual和执行直接oracle sql之间的区别

时间:2018-06-19 10:00:01

标签: sql oracle plsql

select SUM(ABCD.COUNTRY_CODE) from AB_SRP_DETAILS_ALL ABCD 
where rownum <= 1
当COUNTRY_CODE列是varchar2列时,

是INVALID,但使用execute immediate触发时相同的查询是有效的

1 个答案:

答案 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.

那么为什么第一个语句会抛出错误,但第二个语句不会抛出错误?

作为noted in the documentation

  

如果 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.