CREATE OR REPLACE FUNCTION "scope_fun"("in_scope_ids" _int8)
RETURNS TABLE("chapter_id" numeric, "chapter_name" text, "p_id" numeric, "seq" numeric, "creator_id" numeric, "visible" numeric, "scope_id" numeric, "status_id" numeric, "update_time" timestamp, "create_time" timestamp, "is_valid" text, "mask_scope_id" numeric) AS $BODY$
BEGIN
RETURN QUERY
-- 字段一一映射
WITH RECURSIVE sp AS (
SELECT
scope.scope_id AS root_id,
scope.scope_id,
scope.p_id,
1 AS deep
FROM scope
WHERE scope.scope_id = ANY (in_scope_ids)
UNION
SELECT
sp.root_id,
p.scope_id,
p.p_id,
(sp.deep + 1) AS deep
FROM (scope p
JOIN sp ON ((sp.p_id = p.scope_id)))
), cm AS (
SELECT
sp.root_id,
cap.chapter_id,
cap.chapter_name,
cap.p_id,
cap.seq,
cap.creator_id,
cap.visible,
cap.scope_id,
cap.status_id,
cap.update_time,
cap.create_time,
NULL :: CHARACTER VARYING AS is_valid,
sp.deep
FROM (sp
JOIN chapter cap ON ((cap.scope_id = sp.scope_id)))
UNION ALL
SELECT
sp.root_id,
capm.chapter_id,
capm.chapter_name,
capm.p_id,
capm.seq,
capm.creator_id,
capm.visible,
capm.scope_id,
capm.status_id,
capm.update_time,
capm.create_time,
capm.is_valid,
sp.deep
FROM (sp
JOIN chapter_mask capm ON ((capm.scope_id = sp.scope_id)))
), cmds AS (
SELECT
cm.root_id,
cm.chapter_id,
cm.chapter_name,
cm.p_id,
cm.seq,
cm.creator_id,
cm.visible,
cm.scope_id,
cm.status_id,
cm.update_time,
cm.create_time,
cm.is_valid,
cm.deep
FROM cm
ORDER BY cm.deep DESC
)
SELECT
cmds.chapter_id :: NUMERIC,
cover_v((cmds.chapter_name) :: TEXT) AS chapter_name,
cover_n((cmds.p_id) :: NUMERIC) AS p_id,
cover_n((cmds.seq) :: NUMERIC) AS seq,
cover_n((cmds.creator_id) :: NUMERIC) AS creator_id,
cover_n((cmds.visible) :: NUMERIC) AS visible,
min(cmds.scope_id) :: NUMERIC AS scope_id,
cover_n((cmds.status_id) :: NUMERIC) AS status_id,
cover_t(cmds.update_time) AS update_time,
cover_t(cmds.create_time) AS create_time,
cover_v((cmds.is_valid) :: TEXT) AS is_valid,
cmds.root_id :: NUMERIC AS mask_scope_id
FROM cmds
GROUP BY cmds.chapter_id, cmds.root_id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000 这是我postgres的函数,修改这个函数让其能在神舟通用数据库中使用,我的神舟通用数据库是com.oscar.Driver,注意,cover_xx是我的函数
最新发布