【问题标题】:Select from recursive call result in plsql从plsql中的递归调用结果中选择
【发布时间】:2016-03-22 02:45:09
【问题描述】:

TL;DR

在 PL\SQL 中,我需要返回一个可以执行 SELECT 的集合类型,但我无法从记录表中进行选择: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 ;

但是在编译时我得到:PLS-00642: local collection types not allowed in SQL statements

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

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

执行此函数是为了帮助在运行时自动完成,所以我有很强的执行时间约束。但节点数不应超过 5000。

我可以返回什么集合类型以使其正常工作?

【问题讨论】:

    标签: oracle graph plsql


    【解决方案1】:

    尝试定义模式级别类型而不是 plsql 类型。此错误描述您正在尝试访问 plsql 类型而不是 SQL 对象。希望对您有所帮助。

    创建或替换类型 node_search 是对象 ( 身份证号, error_count NUMBER, previous_error_count NUMBER, -- 换位 NODE_CHARACTER VARCHAR2(1) );

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

    【讨论】:

    • 谢谢,但我也试过了,模式级别类型不接受记录>PLS-00201: identifier 'SE_SEARCH.SE_NODE_SEARCH' must be declared
    • 不应该是包名。它应该是您创建类型的模式名称,并且还尝试创建 OBJECT 类型而不是 RECORD 类型
    • 我不能直接在模式中声明记录类型,我得到:PLS-00103: Encountered the symbol "RECORD" when expecting one of the following: array VARRAY_ table object fixed varying opaque sparse
    • 我已经用 OBJECT 类型修改了答案。你能检查一下吗?
    • 这确实有效,但是对象表的行为方式与记录表相同吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2023-04-10
    相关资源
    最近更新 更多