强制转换pl-sql集合中的ROWID



在pl-sql集合中是否有类似的工具?在我的例子中,当我在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,它就像集合的索引。

只能在SQl语句中使用模式级类型,即使在PL/SQl块中也是如此。正如你似乎建议你已经知道,你可以创建自己的对象类型,包括'sequence' 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集合。

如果索引很重要,请使用关联数组(也称为索引表)

引用他的。

相关内容

  • 没有找到相关文章