如何从嵌套表

时间:2016-08-17 13:02:24

标签: oracle oracle11g

我创建了一个对象。

create type tab_billing as object(invoice_no number, 
                                    customername varchar2(100)
                                  );

现在我创建了一个以对象为列的表。

CREATE TABLE tab1 (col1 number,COL2 tab_billing);

无论如何我只能从tab1中选择invoice_no

select col2 from tab1; 

向我提供invoice_nocustomernameSubstr功能在这里无效。

2 个答案:

答案 0 :(得分:4)

您可以直接查询列值的对象字段,但为了避免混淆the object name resolution步骤,您必须提供并使用表别名:

select t1.col2.invoice_no from tab1 t1;

提到in the documentation

  

为了避免内部捕获和解决引用的类似问题,Oracle数据库要求您使用表别名来限定对子程序或对象属性的任何点符号引用。

使用表名对列进行限定是不够的;使用select tab1.col2.invoice_no from tab1获取ORA-00904。您必须使用表别名 - 尽管有点奇怪,如果别名与表名相同,它仍然有效,因此select tab1.col2.invoice_no from tab1 tab1(即将tab1别名为tab1,这是通常是多余的)也可以。

快速演示:

create type tab_billing as object(invoice_no number, 
                                    customername varchar2(100)
                                  );
/

Type TAB_BILLING compiled

CREATE TABLE tab1 (col1 number,COL2 tab_billing);

Table TAB1 created.

insert into tab1 values (1, tab_billing(42, 'Test'));

1 row inserted.

select t1.col2.invoice_no from tab1 t1;

                        COL2.INVOICE_NO
---------------------------------------
                                     42

答案 1 :(得分:2)

您可以使用TREAT

SQL> create type tab_billing as object(invoice_no number,
  2                                      customername varchar2(100)
  3                                    );
  4  /

Type created.

SQL> CREATE TABLE tab1 (col1 number,COL2 tab_billing);

Table created.

SQL> insert into tab1 values (1, tab_billing(10, 'ten')) ;

1 row created.

SQL> select col1,
  2         TREAT(col2 AS tab_billing).invoice_no as invoice_no,
  3         TREAT(col2 AS tab_billing).customername as customername
  4  from tab1;

  COL1 INVOICE_NO CUSTOMERNAME
------ ---------- --------------------
     1         10 ten