我的理解是,除非在数据库级别定义,否则不能在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;
答案 0 :(得分:1)
解决方案很简单 - 使用CREATE TYPE
语句在模式级别声明类型,您将能够在PL / SQL块中的SQL语句中使用集合。
如果您已在PL / SQL包中声明了TYPE
,则无法在PL / SQL块内的查询中使用它。
此外,您必须记住,自Oracle 11.2起,只能在查询中使用varray和嵌套表类型集合,并且不能在查询中使用关联数组。在12c中,您没有这些限制。
如需进一步参考,请转至Oracle Docs。