2014-05-23 35 views
0

在pl-sql集合中是否有任何rowid類似的工具?在我的情況下,當我在sql查詢中使用這個集合時,我也需要序列號,因爲它們被放入。我知道修改是數據結構化的一種方式,但我想使用集合的索引。所以我所尋找的是這樣的:鑄造的pl-sql集合中的ROWID

TYPE t_List IS TABLE OF VARCHAR2(200); 

declare 
v_Data t_List := t_List('data 1' 
         ,'data_2' 
         ,'data3'); 
...... 

FOR Rec IN (SELECT Column_Value v 
        ,ROWID  r 
      FROM TABLE(CAST(v_data t_list))) 
LOOP 
    Dbms_Output.Put_Line('at ' || Rec.r || ':' || Rec.v); 
    -- .... and other codes here 
END LOOP; 

預計不會循環中順序執行的,但我想要的東西內置樣ROWID是像收集的索引。

+1

你已經使它看起來像PL/SQL中定義的類型;是,還是它在模式級別用'create type'定義? –

+0

哦..對不起。它是模式級別類型。 –

回答

0

即使在PL/SQL塊中,也只能在SQl語句中使用模式級類型。正如你似乎表明您已經知道了,你可以創建一個包含了「序」 ID自己的對象類型:

CREATE TYPE t_object AS OBJECT (
    id NUMBER, 
    data VARCHAR2(200) 
) 
/

這類型的集合:

CREATE TYPE t_List IS TABLE OF t_object; 
/

然後填充ID爲您打造的列表:

DECLARE 
    l_List t_List := t_List(t_object(1, 'data 1') 
         ,t_object(2, 'data_2') 
         ,t_object(3, 'data3')); 
BEGIN 
    FOR Rec IN (SELECT id, data 
       FROM TABLE(l_list)) 
    LOOP 
    Dbms_Output.Put_Line('at ' || Rec.id || ':' || Rec.data); 
    -- .... and other codes here 
    END LOOP; 
END; 
/

沒有對象類型,你可以使用ROWNUM虛列:

CREATE TYPE t_List IS TABLE OF VARCHAR2(200); 
/

DECLARE 
    v_Data t_List := t_List('data 1' 
         ,'data_2' 
         ,'data3'); 
BEGIN 
    FOR Rec IN (SELECT Column_Value v 
        ,ROWNUM  r 
       FROM TABLE(v_data)) 
    LOOP 
     Dbms_Output.Put_Line('at ' || Rec.r || ':' || Rec.v); 
     -- .... and other codes here 
    END LOOP; 
END; 
/

anonymous block completed 
at 1:data 1 
at 2:data_2 
at 3:data3 

據我所知,不保證保留原創作序列。我認爲目前幾乎肯定會這樣,但也許你不應該像以前一樣真實。 (There is no order without an order by,但在這裏你沒有任何東西可以在不破壞初始訂單的情況下訂購......)。

如果您查詢表的一個子集 - 我不確定您的意思是「循環不會按順序執行」 - 您需要在過濾之前在子查詢中生成ROWNUM或者它將不一致。你還需要在子查詢中生成ROWNUM,如果你將它加入到其他真實的表中 - 我想你就是這樣,否則你可以使用PL/SQL集合。

+0

我想給你舉個例子。比方說,這個收藏夾裏藏着參加馬拉松比賽的參賽者的姓名。 For循環是爲他們提供一瓶能量飲料。但是對於前三名選手,我們也會提供一塊巧克力!現在把這個集合看作一個ArrayList。我們可以在循環中做很多其他複雜的步驟。但是,我們可以確定,添加的序列號是什麼?謝謝... –

+0

@ user1027056 - 但在那個例子中,你是不是還有一個完成時間的對象類型,你可以通過它來命令?不清楚你放入表類型的數據來自哪裏(另一個表,那麼爲什麼把它放在一個集合中?),或者你爲什麼需要在SQL中使用它 - 而不是遍歷一個關聯數組作爲純粹的PL/SQL活動。 –

+0

:)是的,當然..我甚至在問題中告訴過,序列場景可以使用其他數據結構來實現。別管它。我的基本好奇心是朝着索引。因爲我們可以按照意願通過索引將數據插入到集合索引中,所以我只想知道是否有任何方法可以在SQL查詢中找回這些索引。可能我的例子不夠貼切,但我的好奇心純屬技術性;面向PL-Sql的特性。 :) –

0

如果索引是很重要的,使用關聯數組(也稱爲索引表)

參考his

+0

但是,可以用於SQL查詢;就像在我的例子中,我將它鑄成了表格? –