我有一个查询,从多个表,嵌套的选择查询和函数中选择大量列。
首先我考虑创建一个视图,但创建一个带有IN参数的视图在oracle中并不常见... 所以我想在其中创建一个包含此查询的函数,并将其作为表类型返回。但是,我必须定义一个具有尽可能多的变量的对象类型,并循环遍历每一行或使用批量收集。但是,如果我的查询返回了大约100列,那么定义对象类型将是一场噩梦。
有任何建议如何解决这个问题?
编辑: 我正在寻找的解决方案是使用我的查询创建一个函数,并能够使用SELECT my_function(:param1,:param2)显示结果,或者像select * from table(my_function(: p1,:p2))。表类型是唯一的方法,还是有其他更简单的方法来显示此函数的结果? 为了说清楚,在这种情况下创建一个视图并不是很实用。
EDIT2: 我想创建类型记录,例如:创建具有所有列定义的对象类型,然后创建表类型并将其返回为流水线,如果我想使用SELECT语句检索这些值,则是唯一的方法。或者有一种更简单的方法可以做到这一点?是否可以使用基于游标的记录来简化此操作,并仍使用简单的SELECT语句检索值?
答案 0 :(得分:1)
很抱歉,如果我发表评论会误导您。 你可以有一个引用游标。然后有一个具有光标' s%rowtype的变量。然后可以将这些列作为rowtype_variable.column_name(loop_int)。
进行访问如果这是你期望的任何关闭,那么我可以帮助你更多。否则详细说明你的问题。
答案 1 :(得分:0)
如果你想把你的函数用作一个表(至少你写过这样的东西) - 你必须定义类型才能创建流水线函数。流水线函数可以在SQL语句中用作简单表,因此它符合您的要求。但是再次 - 如果你真的需要流水线功能 - 你必须预定义类型对象并列出那里的所有“列”。 这里是相应的文档:http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm#CHDJEGHC
我不确定你真的需要它.. 我想你可以从你的函数返回简单的sys_refcursor。在这种情况下,没有必要预定义函数之外的任何数据结构。 这是一个简单的例子:
CREATE OR REPLACE FUNCTION get_dummy
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR SELECT 1 FROM dual;
RETURN my_cursor;
END get_dummy;