2

我的理解是你不能在 where 子句中使用集合,除非它是在数据库级别定义的。我非常不喜欢关于模式的随机类型定义。这是一个宗教的事情,所以不要试图劝阻我。

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

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

包中有一个例程实例化和填充 this 的实例。能够在 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;
4

1 回答 1

1

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

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

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

如需进一步参考,请访问Oracle 文档

于 2013-09-04T06:53:39.577 回答