我有此关系表(只有id_padre和id_hijo很有趣):
id | id_padre | id_hijo | cantidad | posicion
----+----------+---------+----------+----------
0 | | 1 | 1 | 0
1 | 1 | 2 | 1 | 0
2 | 1 | 3 | 1 | 1
3 | 3 | 4 | 1 | 0
4 | 4 | 5 | 0.5 | 0
5 | 4 | 6 | 0.5 | 1
6 | 4 | 7 | 24 | 2
7 | 4 | 8 | 0.11 | 3
8 | 8 | 6 | 0.12 | 0
9 | 8 | 9 | 0.05 | 1
10 | 8 | 10 | 0.3 | 2
11 | 8 | 11 | 0.02 | 3
12 | 3 | 12 | 250 | 1
13 | 12 | 5 | 0.8 | 0
14 | 12 | 6 | 0.8 | 1
15 | 12 | 13 | 26 | 2
16 | 12 | 8 | 0.15 | 3
此表存储节点之间的链接(id_padre =父节点,id_hijo =子节点)。 我正在尝试为从特定行开始的行进行递归删除的功能。删除后,我检查是否有更多行具有 id_hijo 列,并且具有与删除第一行相同的值。 如果没有这种情况的行,我必须删除所有 id_padre 等于已删除行的 id_hijo 的行。
即:如果我开始删除id_padre = 3和id_hijo = 4的行,那么我删除此行:
id | id_padre | id_hijo | cantidad | posicion
----+----------+---------+----------+----------
3 | 3 | 4 | 1 | 0
该表仍然像这样:
id | id_padre | id_hijo | cantidad | posicion
----+----------+---------+----------+----------
0 | | 1 | 1 | 0
1 | 1 | 2 | 1 | 0
2 | 1 | 3 | 1 | 1
4 | 4 | 5 | 0.5 | 0
5 | 4 | 6 | 0.5 | 1
6 | 4 | 7 | 24 | 2
7 | 4 | 8 | 0.11 | 3
8 | 8 | 6 | 0.12 | 0
9 | 8 | 9 | 0.05 | 1
10 | 8 | 10 | 0.3 | 2
11 | 8 | 11 | 0.02 | 3
12 | 3 | 12 | 250 | 1
13 | 12 | 5 | 0.8 | 0
14 | 12 | 6 | 0.8 | 1
15 | 12 | 13 | 26 | 2
16 | 12 | 8 | 0.15 | 3
因为没有id_hijo = 4的行,所以我将删除id_padre = 4的行。以此类推。 (在此示例中,过程到此结束)
我已经尝试执行此功能(此功能自行调用):
CREATE OR REPLACE FUNCTION borrar(integer,integer) RETURNS VOID AS
$BODY$
DECLARE
padre ALIAS FOR $1;
hijo ALIAS FOR $2;
r copia_rel%rowtype;
BEGIN
DELETE FROM copia_rel WHERE id_padre = padre AND id_hijo = hijo;
IF NOT EXISTS (SELECT id_hijo FROM copia_rel WHERE id_hijo = hijo) THEN
FOR r IN SELECT * FROM copia_rel WHERE id_padre = hijo LOOP
RAISE NOTICE 'Selecciono: %,%',r.id_padre,r.id_hijo;--for debugging
SELECT borrar(r.id_padre,r.id_hijo);
END LOOP;
END IF;
END;
$BODY$
LANGUAGE plpgsql;
但是我得到这个错误:
ERROR: query has no destination for result data
我知道postgresql wit CTE中有特定的递归方法。我已经使用它遍历图形,但是我不知道在这种情况下如何使用它。
答案 0 :(得分:1)
该错误是由于用于递归调用该函数的SELECT
引起的。 PostgreSQL希望将结果放在某个地方,但是没有告诉它在哪里。
如果要运行函数并丢弃结果,请在PL / PgSQL函数中使用PERFORM
而不是SELECT
。