繁体   English   中英

从双重选择和立即执行oracle sql之间的区别

[英]difference between select from dual and execute immediate oracle sql

select SUM(ABCD.COUNTRY_CODE) from AB_SRP_DETAILS_ALL ABCD 
where rownum <= 1

当列COUNTRY_CODE是varchar2列时,INVALID为INVALID,但使用执行立即数触发时,相同的查询有效

使用更简单(但不合逻辑)的查询:

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_statementSELECT语句,并且您同时省略了into_clausebulk_collect_into_clause ,则execute_immediate_statement永远不会执行。

execute immediate在我的PL / SQL块不具有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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM