2016-08-17 82 views
2

我创建了1个对象。如何从嵌套表中选择列值

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; 

是givng我都invoice_nocustomernameSubstr功能在这里不起作用。

回答

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,通常是冗余的)会起作用。

快速演示:

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 
+0

它有点怪,,我以前选择col2.invoice_no 从标签; - 它没有工作。但别名的工作。 – XING

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 
+0

Perfect..i用错误的列名 – XING