2016-08-17 70 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