2

我已将问题查询提炼为以下示例,但在 metalink 上找不到任何表明这是已知错误或预期行为的内容。

以下脚本是自包含的,因此任何人都可以重现这一点,我正在使用在 RHEL 上运行的 Oracle 11.2.0.3.0 企业 64 位,通过 SQL Developer 提交查询,在 SQL Plus 中出现相同的结果。

第一:创建嵌套表类型。

create type nested_type_test as table of varchar(32);

第二:使用类型作为嵌套类型创建表。

create table nested_table_test (
  uuid          varchar(32)
  , some_values nested_type_test
)
NESTED TABLE some_values STORE AS nested_some_values;

第三:创建一个我们将用来创建连接语句的任意表。

create table join_table (
  uuid  varchar(32)
);

现在来看一些简单的 SQL 语句:

select *
from nested_table_test ntt, table(some_Values) sv;

select *
from nested_table_test ntt, table(some_Values) sv
where ntt.uuid = 'X';

两者都有效,我没有插入数据,但出于这个错误/测试的目的,我们不需要,因为问题是解析问题。下一条语句,我将连接添加到为此目的生成的任意表中。

select *
from nested_table_test ntt, table(some_Values) sv
inner join join_table jt on jt.uuid = ntt.uuid;

这现在产生:ORA-00904: "NTT"."UUID": invalid identifier- 但我知道该字段存在并且可以在 where 子句中引用它。取出这样的TABLE(some_values)子句,

select *
from nested_table_test ntt
inner join join_table jt on jt.uuid = ntt.uuid;

并且查询有效,所以我知道它与语句中嵌套表子句的存在是隔离的。

如果我切换到使用手动连接而不是 ANSI 连接,它会再次解析并执行。

select *
from nested_table_test ntt, table(some_Values) sv, join_table jt
where jt.uuid = ntt.uuid;

或者,甚至更hack-ish:

select *
from nested_table_test ntt, table(some_Values) sv
inner join join_table jt on 1=1
where jt.uuid = ntt.uuid;

也解析 - 所以问题不是ntt.uuid问题本身,而是它出现在解析器似乎难以解决的语句中。

已知错误、未知错误或预期行为?

编辑:使用CROSS JOIN table(some_values) sv会导致服务器上的段错误和跟踪文件,同时转储连接 - 这肯定是一个错误。这也是我不在纯 ANSI 连接语法中的原因。

4

1 回答 1

3

当您混合使用 oracle 和 ANSI 连接语法时,这是预期的行为。ANSI 连接优先于,逗号连接(交叉连接),从左到右解析,因此这意味着ntt当您尝试引用列时尚未连接ntt.uuid,这就是您可能会收到该错误的原因。为此,请选择一种连接类型。例如:

select *
from nested_table_test ntt 
    , table(some_Values) sv
    , join_table jt 
where jt.uuid = ntt.uuid;

或者

select *
  from nested_table_test ntt
 cross join  table(some_Values) sv
  join join_table jt
    on (jt.uuid = ntt.uuid)
于 2012-12-12T18:48:29.087 回答