【发布时间】: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。
我可以返回什么集合类型以使其正常工作?
【问题讨论】: