內部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) ); /
創建上述目的的一個嵌套表型。
CREATE TYPE address_table AS TABLE OF ADDRESS_TYPE; /
我然後創建另一個對象,如下所示:
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) ); /
然後我創建一個嵌套表類型如下:
CREATE TYPE telephone_number_table AS TABLE OF TELEPHONE_NUMBER_TYPE; /
現在,我創建了一個名爲
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 ) ;
我然後創建一個序列爲這樣:
CREATE SEQUENCE sq_personid;
要插入的值到
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
噢,你的意思是我應該使用CREATE TYPE語句在匿名塊之外聲明't_country_codes'類型? – Rachcha 2013-03-20 06:20:54
@Rachcha - 正確。 't_country_codes'集合需要在SQL中聲明,而不是在PL/SQL塊中聲明,以便在SQL語句中使用它。 – 2013-03-20 06:21:59
賓果!完美的作品! – Rachcha 2013-03-20 06:24:08