2016-09-16 3 views
15

그것은 조금 재미 보이지만, 오라클 11g는 정말 이러한 쿼리 그것은 첫 번째 하위 쿼리의 결과를 반환WITH 절에 동일한 alias_name을 가진 여러 하위 쿼리를 허용하는 이유는 무엇입니까?

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

실행할 수 있습니다 (즉, 1).

그런 기능이 유용 할 때 상황을 상상할 수 없습니다. 복사/붙여 넣기 후에 하위 쿼리의 이름을 바꾸는 것을 잊었을 때 문제가 발생하여 전반적인 쿼리가 잘못되었거나 예상치 못한 결과를 반환하는 경우가있었습니다. 다행히도 쿼리는 매우 간단했으며 그 이유는 즉시 발견되었습니다.

어쨌든 오라클은 예외를 throw하고 예외가 발생할 것으로 예상합니다.

제 궁극적 인 문제는 이러한 동작이 기능 또는 버그인지 여부입니다. 기능면 어디에 유용할까요?

감사합니다.

그런데 SQLite는 유사한 쿼리를 실행할 수 없으며 '중복 WITh 테이블 이름'예외를 throw합니다. 다른 db 엔진을 아직 사용해 보지 않았습니다.

+0

Postgres는이를 허용하지 않습니다. –

+1

필자는 My Oracle Support에서 문제를 일으킬 수 있다고 생각합니다. –

+0

12.1.0.2에서 재현되었습니다. –

답변

-2

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

+1

이것에 대해 자세히 설명해 주시겠습니까?오라클은 다른 DBMS가 일반적으로 가지고 있지 않은 중복 된 컬럼 이름으로 무엇을합니까? –

1

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

는 그래서 아마도 동일한 이름을 사용 부질 수있는 과부하 기능을 허용에 관한 것이다. 여전히 버그가있는 것처럼 보이지만이 문서를 찾을 수 없었습니다.