programing

Oracle이 이 쿼리에 대해 "ORA-00918: column undiously defined"를 제기하지 않는 이유는 무엇입니까?

css3 2023. 7. 19. 21:30

Oracle이 이 쿼리에 대해 "ORA-00918: column undiously defined"를 제기하지 않는 이유는 무엇입니까?

저는 방금 오라클에서 ORA-00918이 제기될 것으로 예상하는 이상한 행동을 우연히 발견했지만 그렇지 않습니다.이 쿼리를 예로 들어 보겠습니다.

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

이 쿼리는 일반적으로 트리거가 비활성화된 테이블의 세부 정보를 찾고 있지만 제가 해결하려는 문제가 아닙니다.문제는 이 쿼리, 데이터 사전, 보기 또는 테이블에만 국한되지 않습니다. 제가 알기로는 (제가 시도한 2~3개의) 테이블 또는 보기 집합에 적용됩니다.

어쨌든, 이 쿼리를 실행하려고 하면 ORA-00918이 나옵니다. 왜냐하면 둘 다USER_TABLES그리고.USER_TRIGGERS라는 칼럼이 있습니다.STATUS실행하기 위한 쿼리를 가져오려면WHERE절을 로 변경해야 합니다.TRG.STATUS좋아요, 좋아요, 대신 다른 테이블에 참여해보세요.

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

이 쿼리는 어떤 상태 열을 의미하는지 확인하지 않고 마법처럼 작동합니다!의미론이나 쿼리가 반환하는 내용에 상관없이 오류는 없습니다. USER_CONSTRAINTS라는 열도 있습니다.STATUS또한, 그렇다면 선택할 수 있는 두 개의 열이 있지만 훨씬 더 모호해도 괜찮으면서 어떻게 해야 할지 모르는 이유는 무엇입니까?

참고로 이 모든 것은 10.2.0.3.0에 있으며, 기본적으로 쿼리에 테이블이 두 개 이상 있는 경우 ORA-00918이 발생하지 않습니다.이것이 오라클 버그라면 언제 수정되었는지, 데이터베이스가 업그레이드되면 카우보이 쿼리가 폭발할 가능성이 있는 오라클 버전을 아는 사람이 있습니까?

갱신하다

11.2.0.1.0에서 버그가 수정되었다는 것을 보여준 BQ에게 감사드립니다. 이전 버전에서 수정된 것을 보여줄 수 있는 사람에게는 상금이 지급됩니다!

Oracle 지원을 검색하여 다음을 찾았습니다.

Bug 5368296 - ANSI join SQL이 모호한 열에 대해 ORA-918을 보고하지 않을 수 있음 [ID 5368296.8]

영향을 받는 것으로 확인된 버전:

  • 10.2.0.3
  • 10.2.0.4

이 문제는 다음에서 해결되었습니다.

  • 윈도우즈 플랫폼의 10.2.0.4 패치 2
  • 10.2.0.5(서버 패치 세트)
  • 11.1.0.6(기본 릴리스)

자세한 내용을 보려면 Oracle 지원 계정이 필요하지만 영향을 받은 Oracle Bug 번호/버전을 공유하여 Oracle 지원에 대한 올바른 방향을 알려줘도 괜찮을 것이라고 생각했기 때문에 그 이상의 내용을 게시하지는 않았습니다.

언제 고쳐졌는지는 알 수 없지만, 제 결과는 다음과 같습니다.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> SELECT *
  2  FROM USER_TABLES TAB
  3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
  4  WHERE STATUS = 'DISABLED';
WHERE STATUS = 'DISABLED'
      *
ERROR at line 4:
ORA-00918: column ambiguously defined

SQL> ed
Wrote file afiedt.buf

  1  SELECT *
  2  FROM USER_TABLES TAB
  3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
  4  JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
  5* WHERE STATUS = 'DISABLED'
SQL> /
WHERE STATUS = 'DISABLED'
      *
ERROR at line 5:
ORA-00918: column ambiguously defined

ANSI SQL을 사용하고 있습니다.where 절의 상태와 운전대를 연결하는 것 같습니다.

"oracle" 구문을 사용하면 예상되는 동작을 볼 수 있습니다.

SELECT *
FROM USER_TABLES TAB, USER_TRIGGERS TRG, USER_CONSTRAINTS CON
WHERE TRG.TABLE_NAME = TAB.TABLE_NAME
AND CON.TABLE_NAME = TAB.TABLE_NAME
AND STATUS = 'DISABLED'

여기에서 이에 대한 더 확인된 버그: http://oracledoug.com/serendipity/index.php ?/archives/1555-Bug-Hunting.html

최신 업데이트는 11.2.0.2에서 수정되었습니다.

11.2.0.2.0에서 이 문제를 시도해도 동일한 문제가 발생합니다.기능에 상관없이 왼쪽과 오른쪽 조인을 추가하면 이 버그는 전혀 고쳐지지 않는 것 같습니다!

SELECT *
FROM USER_TABLES TAB
LEFT JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
RIGHT JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

언급URL : https://stackoverflow.com/questions/4269205/why-doesnt-oracle-raise-ora-00918-column-ambiguously-defined-for-this-query