sql – 为什么Oracle允许在WITH子句中具有多个具有相同alias_nam
发布时间:2020-12-12 16:13:25 所属栏目:MsSql教程 来源:网络整理
导读:看起来有点有趣,但是Oracle 11g真的允许这样一个查询运行 with a as (select 1 from dual),a as (select 2 from dual)select *from a; 它返回第一个子查询的结果(即1). 我无法想象这样一个特征可能有用的情况.在我的情况下,当我忘记在复制/粘贴后重新命名一个
看起来有点有趣,但是Oracle 11g真的允许这样一个查询运行
with a as (select 1 from dual),a as (select 2 from dual) select * from a; 它返回第一个子查询的结果(即1). 我无法想象这样一个特征可能有用的情况.在我的情况下,当我忘记在复制/粘贴后重新命名一个子查询,并且整个查询返回错误/意外的结果,这是一个问题.幸运的是查询很简单,原因立即被检测到. 无论如何,我希望Oracle在这种情况下抛出异常. 那么我的问题是这样的行为是一个特征还是一个bug? 谢谢. BTW,SQLite不允许类似的查询运行并抛出“重复的WITh表名”异常.没有尝试任何其他数据库引擎. 解决方法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 ; / 示例1输出:日期为16-MAR-17 所以也许能够使用同名的子查询与允许重载的函数有关.虽然它仍然似乎有bug,但我还没有找到关于这个的文档. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |