在函数中递归删除(错误:查询没有结果数据的目的地)

时间:2018-07-08 17:25:20

标签: sql postgresql plpgsql

我有此关系表(只有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中有特定的递归方法。我已经使用它遍历图形,但是我不知道在这种情况下如何使用它。

1 个答案:

答案 0 :(得分:1)

该错误是由于用于递归调用该函数的SELECT引起的。 PostgreSQL希望将结果放在某个地方,但是没有告诉它在哪里。

如果要运行函数并丢弃结果,请在PL / PgSQL函数中使用PERFORM而不是SELECT