2010-06-14 53 views
0

我想查詢轉換就像下面類型,這樣我就不必使用GTT:混亂有關。在Oracle中的GTT的類型,而不是

insert into my_gtt_table_1 
(house, lname, fname, MI, fullname, dob) 
(select house, lname, fname, MI, fullname, dob 
from (select 'REG' house, mbr_last_name lname, mbr_first_name fname, mbr_mi MI, 
     mbr_first_name || mbr_mi || mbr_last_name fullname, mbr_dob dob from 
     table_1 a, table_b 
     where a.head = b.head and mbr_number = '01' and mbr_last_name = v_last_name) c 

上面只是一個樣本,但複雜的查詢是更大比這個。
上面是一個存儲過程。所以要避免gtt(my_gtt_table_1)。我做了以下內容:

create or replace type lname_row as object 
    (
    house varchar2(30) 
    lname varchar2(30), 
    fname varchar2(30), 
    MI char(1), 
    fullname VARCHAR2(63), 
    dob DATE 
    ) 

create or replace type lname_exact as table of lname_row 

現在在SP:

type lname_exact is table of <what_table_should_i_put_here>%rowtype; 
tab_a_recs lname_exact; 

在上面,我不知道該怎麼把表作爲我的查詢嵌套子查詢。

在SP查詢:(我想這個樣品的目的,看看它的工作原理)

 select lname_row('', 
           '', 
           '', 
           '', 
           '', 
           '', 
           sysdate) bulk collect 
      into tab_a_recs 
     from table_1; 

我得到這樣的錯誤:ORA-00913:值過多

我真的迷茫和堅持這一:(

+0

你爲什麼要刪除這些GTT? – 2010-06-15 06:35:42

回答

2

您與屬性定義的類型,你嘗試用值初始化它試試這個:

select lname_row(/*'',*/ 
        '', 
        '', 
        '', 
        '', 
        '', 
        sysdate) bulk collect 
     into tab_a_recs 
    from table_1; 

編輯 也似乎有關於類型混淆。在Oracle中,您可以在SQL或PL/SQL中定義類型。 SQL類型可以通過SQL(!)訪問,而PL/SQL可以提供一些額外的功能,但對於純SQL是不可見的(PL/SQL也可以訪問SQL類型)。這就是說,將SQL和PL/SQL中的類型命名爲相同(你遇到shadowing問題)是令人困惑和不明智的。您定義了lname_exact類型兩次(使用CREATE STATEMENT和DECLARE塊)。由於您在SQL語句中實例化lname_exact,因此在此情況下選擇的類型是SQL類型(僅具有6個屬性)。

您應該刪除SP上的lname_exact聲明或重命名它。

+1

永遠不要低估簡單算術的力量! – APC 2010-06-14 12:07:45

+0

:)發表問題時,算術是一個錯誤。在實際的代碼中,我計數了兩次以上。我不得不刪除lname_exact並且工作。陰影問題的損失。儘管如此,感謝所有幫助 – Omnipresent 2010-06-14 15:07:47

+0

,如果我爲很多存儲過程執行此操作,那麼我將散佈Oracle對象。我會考慮將與一個存儲過程相關的對象放在一個包中。 – Omnipresent 2010-06-14 15:13:18

0

除了文森特的優秀答案:您不需要在SQL查詢中顯式創建lname_row。 BULK COLLECT將自動匹配所選列與INTO目標的字段。因此,根據您迄今爲止顯示的內容,您不需要在架構級別創建類型,只需要在PL/SQL塊中定義它們即可。

下面是工作一個簡單的例子:

SQL> l 
    1 declare 
    2 type my_row is record (x number, y date); 
    3 type my_tab is table of my_row; 
    4 a_table my_tab; 
    5 begin 
    6 select 1,sysdate 
    7  bulk collect into a_table 
    8  from dual; 
    9 dbms_output.put_line(a_table(1).y); 
10* end; 
SQL>/
14-JUN-10 
+0

我們必須明確地實例化這種類型,如果我們正在使用SQL來定義嵌套表,而不是在PL/SQL中聲明瞭嵌套表。 – APC 2010-06-14 12:55:29