首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >casted pl-sql集合中的ROWID

casted pl-sql集合中的ROWID
EN

Stack Overflow用户
提问于 2014-05-23 07:26:10
回答 2查看 1.1K关注 0票数 0

在pl sql集合中有类似rowid的工具吗?在我的例子中,当我在sql查询中使用这个集合时,我也需要序列号。我知道修改是数据结构的一种方式,但是我想使用集合的索引。所以我要找的是这样的东西:

代码语言:javascript
复制
TYPE t_List IS TABLE OF VARCHAR2(200);

代码语言:javascript
复制
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,它类似于集合的索引。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-23 08:51:15

只有模式级别的类型可以在SQl语句中使用,甚至在PL/SQL块中也是如此。正如您似乎已经知道的那样,您可以创建包含“序列”ID的自己的对象类型:

代码语言:javascript
复制
CREATE TYPE t_object AS OBJECT (
  id NUMBER,
  data VARCHAR2(200)
)
/

以及这种类型的集合:

代码语言:javascript
复制
CREATE TYPE t_List IS TABLE OF t_object;
/

然后在构建列表时填充ID:

代码语言:javascript
复制
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伪object:

代码语言:javascript
复制
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集合。

票数 0
EN

Stack Overflow用户

发布于 2014-05-23 07:31:10

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

请参考他的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23823358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档