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
As,AFAIK,别名任何表只是给表或列提供简单的名称。那么,当我试图从表中检索用户定义的对象时,为什么我在案例1 中遇到错误?当我把桌子别名时,实际上发生了什么。
答案 0 :(得分:3)
Oracle文档声明需要表别名来引用对象的方法或属性,以避免“内部捕获”(表列名称与对象属性名称冲突)的可能性。 Find out more
文档说明:
“即使表名本身由模式名称限定,您也必须使用表别名而不是表名限定对对象属性或方法的引用。”
它没有说明为什么Oracle会执行此规则。但是,由于将对象改造到关系内核中而导致名称空间实现显然存在一些复杂性。
“那么,为什么这个查询可以从emp中选择emp.sal”
因为那是桌子上的常规列。 Oracle从未在普通表上强制使用别名。从现在开始将破坏数十年来积累的大量代码。
使用别名只是使用对象类型定义表列的又一个惩罚。与Oracle的ORDBMS实现相关的笨重语法最为繁琐。
此外,几乎所有使用对象而不是实际表来保存数据的情况都是严格的解决方案,所以它并不重要。