我的理解是你不能在 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;