programing

Oracle이 WITH 절에 alias_name이 동일한 하위 쿼리를 여러 개 허용하는 이유는 무엇입니까?

kingscode 2023. 7. 20. 22:52
반응형

Oracle이 WITH 절에 alias_name이 동일한 하위 쿼리를 여러 개 허용하는 이유는 무엇입니까?

약간 웃기게 보이지만 Oracle 11g는 실제로 그러한 쿼리를 실행할 수 있습니다.

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

첫 번째 하위 쿼리(예: 1)의 결과를 반환합니다.

저는 그런 기능이 유용할 수 있는 상황을 상상할 수 없습니다.이 경우 하위 쿼리를 복사/붙여넣은 후 이름을 바꾸는 것을 잊어버리고 전체 쿼리가 잘못된/예상치 못한 결과를 반환하는 경우 문제가 발생했습니다.다행히 쿼리는 매우 간단했고 그 이유는 즉시 감지되었습니다.

어쨌든, 저는 Oracle이 이러한 경우에는 예외를 둘 것으로 예상합니다.

그래서, 제 질문은 그러한 행동이 특징인지 아니면 버그인지입니다.기능이 있다면 어디에서 유용할 수 있습니까?

감사해요.

그런데 SQLite에서는 유사한 쿼리를 실행할 수 없으며 '테이블 이름이 있는 복제' 예외를 발생시킵니다.다른 DB 엔진은 아직 시도하지 않았습니다.

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 출력:date is 16-MAR-17예 2 출력:17-MAR-17

따라서 동일한 이름의 하위 쿼리를 사용할 수 있다는 것은 오버로드된 함수를 허용하는 것과 관련이 있을 수 있습니다.아직 버그가 있는 것 같고 문서를 찾을 수가 없습니다.

유용하지는 않지만 오라클이 중복 열 이름을 처리하는 방식과 일치합니다.

언급URL : https://stackoverflow.com/questions/39525004/why-does-oracle-allow-having-several-subqueries-with-the-same-alias-name-in-a-wi

반응형