pl-sql集合中是否有类似rowid的设施?在我的情况下,当我在sql查询中使用此集合时,我还需要输入序列号。我知道修改是数据结构是一种方式,但我想使用集合的索引。所以我要找的是这样的:
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这样内置的东西,就像集合的索引一样。
答案 0 :(得分:0)
如果索引很重要,请使用关联数组(也称为索引表)
参考his。
答案 1 :(得分: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集合。