2013-03-20 52 views
2
  1. 內部SQL類別我首先創建一個對象address_type使用嵌套表變量/在PL/SQL塊

    CREATE TYPE address_type AS OBJECT 
    (line1       VARCHAR2(100) 
    , line2       VARCHAR2(100) 
    , line3       VARCHAR2(100) 
    , city       VARCHAR2(50) 
    , state       VARCHAR2(50) 
    , country      VARCHAR2(50) 
    , zip       VARCHAR2(10) 
    ); 
    /
    
  2. 創建上述目的的一個嵌套表型。

    CREATE TYPE address_table AS TABLE OF ADDRESS_TYPE; 
    /
    
  3. 我然後創建另一個對象,如下所示:

    CREATE TYPE telephone_number_type AS OBJECT 
    (country_code     VARCHAR2(4) 
    , area_code      VARCHAR2(10) 
    , phone_number     VARCHAR2(10) 
    , extension      VARCHAR2(10) 
    , number_type     VARCHAR2(10) 
    ); 
    /
    
  4. 然後我創建一個嵌套表類型如下:

    CREATE TYPE telephone_number_table AS TABLE OF TELEPHONE_NUMBER_TYPE; 
    /
    
  5. 現在,我創建了一個名爲person表。其中許多列在這個問題中沒有多大用處,除了telephone_numbers列是嵌套表telephone_number_table類型。

    CREATE TABLE person 
    (personid      INTEGER   PRIMARY KEY 
    , fname       VARCHAR2(50)  NOT NULL 
    , mname       VARCHAR2(50) 
    , lname       VARCHAR2(50)  NOT NULL 
    , email       VARCHAR2(255) UNIQUE 
    , password      VARCHAR2(255) NOT NULL 
    , birthdate      DATE 
    , billing_address    ADDRESS_TABLE 
    , delivery_address    ADDRESS_TABLE 
    , telephone_numbers    TELEPHONE_NUMBER_TABLE 
    , display_pic     BLOB 
    , ts_registration    TIMESTAMP 
    , ts_verification    TIMESTAMP 
    , ts_last_updated    TIMESTAMP 
    ) NESTED TABLE billing_address STORE AS nt_billing_address 
    , NESTED TABLE delivery_address STORE AS nt_delivery_address 
    , NESTED TABLE telephone_numbers STORE AS nt_telephone_numbers 
    , LOB(display_pic) STORE AS SECUREFILE (
        TABLESPACE users 
        ENABLE STORAGE IN ROW 
        CHUNK 4096 
        PCTVERSION 20 
        NOCACHE 
        NOLOGGING 
        COMPRESS HIGH 
    ) 
    ; 
    
  6. 我然後創建一個序列爲這樣:

    CREATE SEQUENCE sq_personid; 
    
  7. 要插入的值到person表我使用匿名塊如下:

    DECLARE 
        v_fname person.fname%TYPE := 'Yogeshwar'; 
        v_mname person.mname%TYPE := ''; 
        v_lname person.lname%TYPE := 'Rachcha'; 
        v_email person.email%TYPE := '[email protected]'; 
        v_password person.password%TYPE := 'mail_123'; 
        v_birthdate person.birthdate%TYPE := TO_DATE('28-03-1987', 'DD-MM-YYYY'); 
        v_telephone_numbers TELEPHONE_NUMBER_TABLE; 
        v_billing_address ADDRESS_TABLE; 
        v_delivery_address ADDRESS_TABLE; 
    BEGIN 
        v_telephone_numbers := TELEPHONE_NUMBER_TABLE 
              (TELEPHONE_NUMBER_TYPE('+91','22','123456','','Residence') 
                    , TELEPHONE_NUMBER_TYPE('+91','22','456798','123','Office') 
                    , TELEPHONE_NUMBER_TYPE('+91','','1234567890','','Mobile')); 
    
        v_billing_address := ADDRESS_TABLE (ADDRESS_TYPE ('Line 1', 'Line 2', 'Line 3', 'Mumbai', 'Maharashtra', 'India', '123456')); 
        v_delivery_address := ADDRESS_TABLE (ADDRESS_TYPE ('Line 1', 'Line 2', 'Line 3', 'Mumbai', 'Maharashtra', 'India', '123456')); 
        -- billing and delivery addresses are the same. These are not much importance in this question. 
    
        INSERT INTO person VALUES 
        (sq_personid.nextval 
        , v_fname 
        , v_mname 
        , v_lname 
        , v_email 
        , v_password 
        , v_birthdate 
        , v_billing_address 
        , v_delivery_address 
        , v_telephone_numbers 
        , NULL 
        , sysdate 
        , sysdate 
        , sysdate); 
    
    END; 
    

一切直到這一點絕對完美。然後,在象下面的匿名塊,我嘗試創建一個嵌套表變量,並用它在一個SQL查詢:

DECLARE 
    TYPE t_country_codes IS TABLE OF VARCHAR2(4); 
    country_codes T_COUNTRY_CODES := T_COUNTRY_CODES('+1', '+44', '+91'); 
    cc VARCHAR2(4); 
BEGIN 
    FOR i IN (SELECT t.country_code 
          FROM person p 
          CROSS JOIN TABLE(p.telephone_numbers) t 
         WHERE t.country_code IN (SELECT COLUMN_VALUE -- I doubt the problem is with this SELECT statement. 
                FROM TABLE(country_codes))) LOOP 
     dbms_output.put_line(i.country_code); 
    END LOOP; 
END; 
/

我得到這個錯誤:

ORA-06550: line 8, column 70: 
PLS-00642: local collection types not allowed in SQL statements 
ORA-06550: line 8, column 64: 
PL/SQL: ORA-22905: cannot access rows from a non-nested table item 

回答

6

嵌套表類型可以聲明爲在SQL(通過CREATE TYPE聲明就像你與telephone_number_table類型所做的那樣)或PL/SQL(通過TYPE聲明DECLARE塊)。如果您在PL/SQL中聲明類型,則不能在SQL中使用該類型的實例。您需要在SQL中聲明該類型才能在SQL中使用該類型的實例。

+1

噢,你的意思是我應該使用CREATE TYPE語句在匿名塊之外聲明't_country_codes'類型? – Rachcha 2013-03-20 06:20:54

+0

@Rachcha - 正確。 't_country_codes'集合需要在SQL中聲明,而不是在PL/SQL塊中聲明,以便在SQL語句中使用它。 – 2013-03-20 06:21:59

+0

賓果!完美的作品! – Rachcha 2013-03-20 06:24:08

2

請嘗試移動你的「本地」(從最後一個塊)集合定義到模式級別。

此外,this後可以是有幫助的。

+0

無法爲嵌套表中的值創建字符串的實際表。 Burleson的答案不適用於我的情況。不能接受。 – Rachcha 2013-03-20 06:27:37