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

时间:2016-03-22 02:45:09

标签: oracle graph plsql

TL; DR

在PL \ SQL中,我需要返回一个我可以做SELECT的集合类型,但是我不能从记录表中选择:blocks_controller.rb

长版

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

PLS-00642: local collection types not allowed in SQL statements

在一个包中,我有一个表示图遍历的递归算法。它返回当前为条件和步骤访问的所有可能节点。它假设我们可以在任何节点上启动。伪代码就是这样。

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 ;

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

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

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

我可以返回什么样的集合类型来使其工作?

1 个答案:

答案 0 :(得分:0)

尝试定义架构级别类型而不是plsql类型。此错误表明您正在尝试访问plsql类型而不是SQL对象。希望有所帮助。

创建或替换类型node_search IS OBJECT(     身份证号码,     error_count NUMBER,     previous_error_count NUMBER, - 用于换位     NODE_CHARACTER VARCHAR2(1) );

创建或替换类型se_node_search_list IS TABLE OF node_search;