如何在包中的Oracle where子句中轻松使用集合?

时间:2013-09-03 19:10:40

标签: oracle plsql

我的理解是,除非在数据库级别定义,否则不能在where子句中使用集合。我对于模式的随机类型定义有明显的不喜欢。这是一种宗教信仰,所以不要试图劝阻我。

包中包含的类型很酷,因为它们很容易找到并且与手头的工作有关。所以说我有一个包定义了一个结构(当前是一个表类型集合),看起来像;

  TYPE WORD_LIST_ROW IS RECORD(
    WORD VARCHAR(255));
  TYPE WORD_LIST IS TABLE OF WORD_LIST_ROW;

程序包中有一个例程,它实例化并填充此实例。能够在where子句中使用实例化对象或某些模拟函数将是有用的。

因此,作为聪明的(或者我认为的)程序员,我说为什么我不创建一个流水线函数来从我做的集合中创建一个表,看起来像;

  FUNCTION WORD_LIST_TABLE(IN_WORD_LIST WORD_LIST) RETURN WORD_LIST PIPELINED
  AS
    OUT_WORD_LIST WORD_LIST := WORD_LIST();
  BEGIN
    FOR I IN 1 .. IN_WORD_LIST.COUNT
    LOOP
      PIPE ROW(IN_WORD_LIST(I));
    END LOOP;
    RETURN;
  END WORD_LIST_TABLE;

然后在另一个例程中,我调用构建集合的函数,最后我使用了一个流水线函数,该函数使用集合作为游标where子句中的输入。

有点像这样;

cursor xyz
is 
    select * from x-stuff where fieldA in (select word from table(word_list_table(temp_word_list));

在游标的循环中,我得到一个oracle错误,ora-21700对象不存在或被标记为删除。

有没有简单的方法来构建可以在Oracle where子句中使用的oracle对象?基本上我想做的是;

select * from whatever where fielda in myobject;

1 个答案:

答案 0 :(得分:1)

解决方案很简单 - 使用CREATE TYPE语句在模式级别声明类型,您将能够在PL / SQL块中的SQL语句中使用集合。

如果您已在PL / SQL包中声明了TYPE,则无法在PL / SQL块内的查询中使用它。

此外,您必须记住,自Oracle 11.2起,只能在查询中使用varray和嵌套表类型集合,并且不能在查询中使用关联数组。在12c中,您没有这些限制。

如需进一步参考,请转至Oracle Docs