2013-04-18 1 views
1
SQL> -- CASE 1 

SQL>select nest_test.id.num from nest_test; 
select nest_test.id.num from nest_test 
     * 
ERROR at line 1: 
ORA-00904: "NEST_TEST"."ID"."NUM": invalid identifier 

SQL> -- CASE 2 

SQL>select n.id.num from nest_test n; 

    ID.NUM 
---------- 
     12 

마찬가지로 AFAIK는 모든 테이블의 별명을 지정하면 테이블 또는 컬럼에 단순한 이름을 부여합니다. 그런 다음 왜 케이스 1에 오류가 발생합니까? 테이블에서 사용자 정의 개체를 검색하려고 할 때? 내가 테이블에 앨리어스를 붙였을 때 실제로 일어난 일.테이블에서 사용자 정의 데이터 유형을 검색하십시오.

+0

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm –

+0

그래서 앨리어싱이 실제로 효과가 있습니까? – Ravi

답변

3

오라클 설명서에는 "내부 캡처"(개체 열 이름과 충돌하는 테이블 열 이름)의 가능성을 피하기 위해 개체의 메서드 나 특성을 참조하는 데 테이블 별칭이 필요하다고 나와 있습니다. Find out more.

문서 상태 :

는 "당신은 테이블 별칭이 아닌 테이블 이름 자체가 스키마 이름으로 규정 된 경우에도 테이블 이름을 가진 객체의 속성 또는 메서드에 대한 참조를 한정해야합니다."

오라클이이 규칙을 적용하는 이유는 언급하지 않습니다. 그러나 관계형 커널에 객체를 추가함으로써 발생하는 네임 스페이스 구현에는 분명히 약간의 복잡성이 있습니다.

"이 쿼리는 EMP에서 선택 emp.sal을 왜 작동 후,"


은 테이블에 정기적으로 칼럼이기 때문에. 오라클은 일반 테이블에서 별칭을 적용하지 않습니다. 이제 시작하면 수십 년 동안 엄청난 양의 코드가 깨지게됩니다.

별칭을 사용하면 개체 유형을 사용하여 테이블 열을 정의하는 데 또 하나의 불이익이 있습니다. 오라클의 ORDBMS 구현과 관련된 까다로운 구문의 가장 까다로운 측면과는 거리가 멀습니다.

게다가 데이터를 유지하기 위해 실시간 테이블이 아닌 객체를 사용하는 것이 엄연 한 해결책이므로 거의 중요하지 않습니다.

관련 문제