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中出现错误?当我给我的表起别名时,实际发生了什么。

4

1 回答 1

3

Oracle 文档指出,需要表别名来引用对象的方法或属性,以避免潜在的“内部捕获”(表列名称与对象属性名称冲突)。 了解更多

该文档指出:

“即使表名本身由模式名称限定,您也必须使用表别名而不是表名来限定对对象属性或方法的引用。”

它没有说明甲骨文为何强制执行此规则。但是在命名空间实现中显然存在一些复杂性,这是由于将对象改装到关系内核中造成的。


“那么,为什么这个查询有效 select emp.sal from emp”

因为那是表格上的常规列。Oracle 从未对普通表强制使用别名。从现在开始将破坏数十年来积累的大量代码。

必须使用别名只是使用对象类型定义表列的另一种惩罚。它远不是 Oracle 的 ORDBMS 实现所附带的笨拙语法中最繁重的方面。

此外,几乎在某些情况下,使用对象而不是现实表来持久化数据是正确的解决方案,所以这并不重要。

于 2013-04-18T07:52:58.357 回答