【发布时间】:2021-03-27 07:09:02
【问题描述】:
我想创建一个函数用于获取节点遍历路径。
CREATE TYPE IDType AS (id uuid);
drop function F_ItemPath;
CREATE OR REPLACE FUNCTION F_ItemPath (item record)
RETURNS TABLE (item_id uuid, depth numeric)
AS $$
BEGIN
return QUERY
WITH recursive item_path AS (
SELECT ic.parent_item_id, depth=1
from item_combination ic, item i
WHERE ic.child_item_id=i.id
UNION all
SELECT ic.parent_item_id, depth=ip.depth + 1
FROM item_path ip, item_combination ic WHERE ip.parent_item_id=ic.child_item_id
)
SELECT item_id=ip.parent_item_id, depth=ip.depth FROM item_path ip;
END; $$
LANGUAGE plpgsql;
select * from F_ItemPath(('55D6F516-7D8F-4DF3-A4E5-1E3F505837A1', 'FFE2A4D3-267C-465F-B4B4-C7BB2582F1BC'))
有两个问题:
- 我尝试使用自定义类型设置参数类型
CREATE TYPE IDType AS (id uuid);,但不知道如何使用表参数调用函数 - 有一个错误提示:
SQL Error [42703]: ERROR: column ip.depth does not exist
Where: PL/pgSQL function f_itempath(record) line 3 at RETURN QUERY
我期望的是我可以正常使用该函数,并且可以从其他表中提供参数。
这是您可以尝试的完整查询:
http://sqlfiddle.com/#!15/9caba/1
我在 DBEAVER 应用程序中进行了查询,它会有一些不同的错误消息。
我建议你可以在 sqlfiddle 之外进行试验。
【问题讨论】:
-
只是你的函数的
WITH.....;部分返回一个错误(“错误:列“深度”不存在位置:68”),您应该首先修复它。如果函数的定义不正确,则无法使用函数,因此“我期望的是我可以正常使用该函数”是 ??见:sqlfiddle.com/#!15/9caba/18
标签: sql postgresql plpgsql column-alias