2013-05-22 79 views
3

如何使用批量收集填充具有多個%rowtype字段的記錄表?使用具有多個%rowtype字段的Oracle PL/SQL記錄表

我的代碼:

 drop table child_table; 
     drop table parent_table; 
    /
     create table parent_table(pk number primary key); 
     create table child_table(pk number primary key, fk REFERENCES parent_table(pk)); 
    /
     insert into parent_table (pk) values (1); 
     insert into parent_table (pk) values (2); 

     insert into child_table (pk, fk) values (11, 1); 
     insert into child_table (pk, fk) values (21, 1); 
     insert into child_table (pk, fk) values (32, 2); 
    /
     declare 

     type rec is record 
     (
      parent parent_table%rowtype, 
      child child_table%rowtype 
     ); 
     type tbl is table of rec; 
     v_table tbl := tbl(); 

     -- this works 
     type tbl_parent is table of parent_table%rowtype; 
     v_parent_table tbl_parent := tbl_parent(); 

     begin 
     -- this works 
     select * bulk collect into v_parent_table from parent_table; 

     -- this doesn't work 
     select * bulk collect into v_table from parent_table parent 
     inner join child_table child on parent.pk = child.fk; 

     end; 

這個代碼不工作,但引發以下錯誤消息:

ORA-06550: line 13, column 30: 
PLS-00597: expression 'V_TABLE' in the INTO list is of wrong type 
ORA-06550: line 13, column 30: 
PLS-00597: expression 'V_TABLE' in the INTO list is of wrong type 
ORA-06550: line 13, column 38: 
PL/SQL: ORA-00904: : invalid identifier 
ORA-06550: line 13, column 3: 
PL/SQL: SQL Statement ignored 

這樣就ok了,Oracle說使用im了錯誤的數據類型,我同意。但如何解決它?

+0

'SELECT * FROM聯接B'不給你,你可以拆分這樣的獨立行,如我認爲你意識到。是否有理由不能在記錄定義中使用'%type'而不是'%rowtype'來明確列出這兩個表中的字段(或者至少是你真正想要檢索的字段)?除了它需要更多的打字,顯然...... –

回答

6

由於加入SELECT *的列與表中的列不同,您將收到錯誤消息。

使用CURSOR%rowtype

SQL> DECLARE 
    2  CURSOR cc IS 
    3  SELECT p.pk, c.pk cpk, c.fk 
    4   FROM parent_table p 
    5   JOIN child_table c ON p.pk = c.fk; 
    6  TYPE tbl_join IS TABLE OF cc%ROWTYPE; 
    7  l_table tbl_join; 
    8 BEGIN 
    9  OPEN cc; 
10  FETCH cc BULK COLLECT INTO l_table; 
11  CLOSE cc; 
12 END; 
13/

PL/SQL procedure successfully completed 

或者不使用SELECT *

SQL> DECLARE 
    2  TYPE tbl_child IS TABLE OF child_table%ROWTYPE; 
    3  l_table tbl_child; 
    4 BEGIN 
    5  SELECT c.* BULK COLLECT INTO l_table 
    6  FROM parent_table p 
    7  JOIN child_table c ON p.pk = c.fk; 
    8 END; 
    9/

PL/SQL procedure successfully completed 
+0

thx提示與遊標%rowtype生病使用此。有沒有可能根據模式級別上的光標定義類型? – Jakob

+1

是的,遊標可以在包頭中定義。 –

+0

thx,我會爲此使用一個包 – Jakob

相關問題