在postgresql中使用PERFORM进行递归查询功能

问题描述 投票:-1回答:1

我有一个递归查询,我想在postgresql函数中使用它应该返回一个布尔值。

CREATE OR REPLACE FUNCTION store.is_item(object1 VARCHAR(40), object2 VARCHAR(40))
RETURNS BOOLEAN AS $$
BEGIN
   WITH RECURSIVE externals AS (
   SELECT object_id, used_id
   FROM store.obj_depend
   WHERE external = true
   ), history AS (
   SELECT content_id AS id
   FROM store.minfos
   WHERE id= $2
   UNION
   SELECT externals.used_id
   FROM externals
   INNER JOIN history ON history.id = externals.object_id
   ),
   PERFORM (SELECT c.id FROM store.cinfo AS c WHERE c.id = $1 INNER JOIN history 
   ON c.id = history.id);
   RETURN FOUND;
END;
$$ LANGUAGE plpgsql;

当我尝试这个时它给出错误syntax error at or near SELECT

postgresql plpgsql common-table-expression postgresql-9.5
1个回答
0
投票

PERFORM是plpgsql语句,不能在任何SQL命令中使用。

您可以像提议的@klin一样使用PERFORM,但是然后在子查询中使用CTE,并且子查询每次都返回一行。那么FOUND变量应该每次都是真的。

在这种情况下最好使用辅助变量作为目标:

CREATE OR REPLACE FUNCTION store.is_item(object1 VARCHAR(40), object2 VARCHAR(40))
RETURNS BOOLEAN AS $$
DECLARE r record;
BEGIN
  WITH RECURSIVE 
    externals AS (SELECT object_id, used_id
                    FROM store.obj_depend
                   WHERE external = true)
    history AS (SELECT content_id AS id
                  FROM store.minfos
                 WHERE id = object2
                UNION
                SELECT externals.used_id
                  FROM externals
                       INNER JOIN history ON history.id = externals.object_id)
  SELECT c.id
    FROM store.cinfo AS c 
         INNER JOIN history ON c.id = history.id
   WHERE c.id = $1 
    INTO r;
  RETURN FOUND;
END;
$$ LANGUAGE plpgsql; 
© www.soinside.com 2019 - 2024. All rights reserved.