在 SQL 语句中只能使用模式级别的类型,即使在 PL/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
据我所知,不能保证保留原始创建顺序。我认为目前几乎可以肯定它会,但也许不是你应该依赖的东西,因为它始终是真实的。(没有 就没有订单order by
,但在这里你没有任何东西可以在不破坏初始订单的情况下订购......)。
如果您查询表的一个子集 - 我不确定您所说的“循环不应该按顺序执行”是什么意思 - 您需要ROWNUM
在过滤之前在子查询中生成,否则它将不一致. ROWNUM
如果您要将它加入到其他真实的表中,您还需要在子查询中生成- 我想您是,否则您可以使用 PL/SQL 集合。