即使在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集合。
你已經使它看起來像PL/SQL中定義的類型;是,還是它在模式級別用'create type'定義? –
哦..對不起。它是模式級別類型。 –