看起来有点有趣,但是Oracle 11g真的允许这样一个查询运行
with a as (select 1 from dual),a as (select 2 from dual) select * from a;
它返回第一个子查询的结果(即1).
我无法想象这样一个特征可能有用的情况.在我的情况下,当我忘记在复制/粘贴后重新命名一个子查询,并且整个查询返回错误/意外的结果,这是一个问题.幸运的是查询很简单,原因立即被检测到.
无论如何,我希望Oracle在这种情况下抛出异常.
那么我的问题是这样的行为是一个特征还是一个bug?
如果功能,哪里可能有用?
谢谢.
解决方法
WITH子句也可以与函数一起使用.我不知道这是否可用于11g,但它是12c.所以这个“错误”可能是重载功能所必需的.
例如,该过程使用完全相同的函数两次,具有相同的输入/输出数据类型.
WITH FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN 'date is '|| pid; END; FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN 'date is '|| pid; END; SELECT get_date(cast(sysdate as varchar2(20))) FROM dual ; /
如预期的那样,它返回一个错误:
ORA-06553: PLS-305: prevIoUs use of 'GET_DATE' (at line 1) conflicts with this use
但是如果你重载了这个函数,那么它有相同的名称,但接受不同的参数类型,它将会工作.该过程将无错误地运行,并且根据变量数据类型,使用正确的功能.
WITH FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN 'date is '|| pid; END; FUNCTION get_date(pid IN DATE) RETURN VARCHAR2 IS BEGIN RETURN pid+1; END; SELECT get_date(cast(sysdate as varchar2(20))) /*example1*/ --get_date(sysdate) /*example2*/ FROM dual ; /