Oracle 从plsql中的递归调用结果中选择

Oracle 从plsql中的递归调用结果中选择,oracle,graph,plsql,Oracle,Graph,Plsql,TL;博士 在PL\SQL中,我需要返回一个可以进行选择的集合类型,但不能从记录表中进行选择:PLS-00642:SQL语句中不允许使用本地集合类型 长版本 我有一个表示图的节点的表和一个表示其定向弧的表: node_table( node_id int, data ) arc_table( source_node_id int, destination_node_id int ) 在一个包中,我有一个表示图遍历的递归算法。它返回当前针对某个条件和多个步骤访

TL;博士

在PL\SQL中,我需要返回一个可以进行选择的集合类型,但不能从记录表中进行选择:PLS-00642:SQL语句中不允许使用本地集合类型

长版本

我有一个表示图的节点的表和一个表示其定向弧的表:

node_table(
    node_id int,
    data 
)

arc_table(
    source_node_id int,
    destination_node_id int
)
在一个包中,我有一个表示图遍历的递归算法。它返回当前针对某个条件和多个步骤访问的所有可能节点。它假定我们可以从任何节点开始。伪代码是这样的

function getPossibleNodes(number_of_steps, condition):
returns node_collection_type
declare 
    previous_result  node_collection_type
    result           node_collection_type
begin
    if number_of_step = 0:
        select node_id 
        bulk collect into result 
        from node_table;
    else
        previous_result = getPossibleNodes(number_of_steps - 1, condition);
        select destination_node_id 
        bulk collect into result
        from node_table join arc_table on 
            node_id = source_node_id
        where *condition*
    end id;
    return result;
end;
问题在于返回数据的格式。我想返回一个记录表,声明如下:

TYPE node_search IS RECORD (
    ID INT,
    error_count INT,
    previous_error_count INT, -- for transposition 
    NODE_CHARACTER VARCHAR(1)
);

TYPE se_node_search_list IS TABLE OF node_search ;
但是在编译时,我得到了:PLS-00642:SQL语句中不允许使用本地集合类型

我一直在考虑使用光标,但在每一行上循环意味着进行选择,以便从每一行的当前节点访问节点。另外,我不确定是否可以用这种方式填充另一个游标以返回当前迭代

我尝试将当前包中的记录类型和表类型声明为全局类型,但它无法访问当前类型

执行此函数是为了帮助在运行时自动完成,因此我有很强的执行时间限制。但是,节点数不应大于5000


我可以返回哪种收集类型才能使其正常工作

尝试定义架构级别的类型,而不是plsql类型。此错误表示您正试图访问plsql类型而不是SQL对象。希望这对你有帮助

创建或替换类型节点\u搜索是对象 身份证号码 错误计数编号, 上一个错误计数-用于换位 节点\字符VARCHAR21 ;


创建或替换类型se_node_search_list是node_search的表

谢谢,但我也试过了,模式级别类型><中不接受该记录,因此我尝试在包头中声明该记录,并通过以下方式访问它:创建或替换类型se_node_search_list作为包名称的表。se_node_search;但我得到:PLS-00201:标识符“SE_SEARCH.SE_NODE_SEARCH”必须是declaredIt,而不应是包名。它应该是您创建类型的模式名称,并尝试创建对象类型而不是记录类型I无法在模式中直接声明记录类型,我得到:PLS-00103:在预期以下情况之一时遇到符号记录:数组VARRAY_uuuTable对象已修复可变不透明sparseI已使用对象类型修改了答案。你能检查一下吗?这确实有效,但是对象表的行为是否与记录表的行为相同?