gpt4 book ai didi

sql - 为什么 Oracle 允许在 WITH 子句中有多个具有相同 alias_name 的子查询?

转载 作者:行者123 更新时间:2023-12-03 20:59:49 25 4
gpt4 key购买 nike

看起来有点滑稽,但 Oracle 11g 确实允许运行这样的查询

with
a as (select 1 from dual),
a as (select 2 from dual)
select *
from a;

它返回第一个子查询的结果(即 1)。

我只是无法想象这种功能会有用的情况。在我的情况下,当我在复制/粘贴后忘记重命名子查询并且整个查询返回错误/意外结果时,它反而引起了问题。幸运的是,查询非常简单,并且立即检测到原因。

无论如何,我希望 Oracle 在这种情况下抛出异常。

所以,我的问题是这种行为是功能还是错误?
如果有功能,它可能在哪里有用?

谢谢。

顺便说一句,SQLite 不允许运行类似的查询并抛出“重复的表名”异常。还没有尝试任何其他数据库引擎。

最佳答案

WITH 子句也可以与函数一起使用。我不确定这是否适用于 11g,但适用于 12c。所以这个“ bug ”对于重载的函数可能是必要的。

例如,此过程两次使用完全相同的函数,具有相同的输入/输出数据类型。

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 输出: date is 16-MAR-17示例 2 输出: 17-MAR-17
因此,也许能够使用具有相同名称的子查询与允许重载函数有关。虽然它看起来仍然有问题,但我一直无法找到有关此的文档。

关于sql - 为什么 Oracle 允许在 WITH 子句中有多个具有相同 alias_name 的子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39525004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com