创建一个存储过程来删除记录postgres

问题描述 投票:0回答:2

我创建了一个删除多条记录的函数。在我们的表中包含 uuid 类型的 id。我们得到的输入就像 ids 数组。

  CREATE OR REPLACE FUNCTION public.deletetVersion(item_list uuid[])
  RETURNS TABLE(id uuid[]) 
  LANGUAGE 'plpgsql'
  COST 100
  VOLATILE PARALLEL UNSAFE
  ROWS 1000
  AS $BODY$
   BEGIN
       RETURN QUERY
         DELETE FROM version WHERE id = ANY(item_list);
  END; 
 $BODY$;

从deleteVersion中选择*(数组['b6ad1912-e4f1-4419-831a-c70df89ffd63','877898f0-2f3f-4890-a658-898e35ffee3a'])

但是我收到了这样的错误:

错误:函数deleteversion(text[])不存在

postgresql stored-functions
2个回答
0
投票

这是因为

Array['b6ad1912-e4f1-4419-831a-c70df89ffd63','877898f0-2f3f-4890-a658-898e35ffee3a']

被视为文本[]

尝试以下方法

Array['b6ad1912-e4f1-4419-831a-c70df89ffd63'::uuid,'877898f0-2f3f-4890-a658-898e35ffee3a'::uuid] 

作为函数的参数

例如

  CREATE OR REPLACE FUNCTION public.test_uuid(item_list uuid[])
  RETURNS TABLE(id uuid[]) 
  LANGUAGE 'plpgsql'
  COST 100
  VOLATILE PARALLEL UNSAFE
  ROWS 1000
  AS $BODY$
   BEGIN
       RETURN QUERY
         SELECT item_list;
  END; 
 $BODY$;
 
 
 
 SELECT * from test_uuid(Array['b6ad1912-e4f1-4419-831a-c70df89ffd63'::uuid])

删除时

  CREATE OR REPLACE FUNCTION public.test_uuid(item_list uuid[])
  RETURNS VOID
  LANGUAGE 'plpgsql'
  COST 100
  VOLATILE PARALLEL UNSAFE
  ROWS 1000
  AS $BODY$
  BEGIN
   RETURN QUERY
     DELETE from tableName WHERE id = ANY(item_list);

  END; 
  $BODY$;

0
投票

您的函数应返回

setof uuid
- 即 uuid-s 表 - 或
uuid[]
。我更喜欢第一个。你不需要 PL/pgSQL,普通 SQL 就足够了。所以函数是:

create or replace function public.deletetVersion(item_list uuid[])
returns setof uuid language 'sql' as
$$
  delete from version where id = any(item_list) returning id;
$$;

返回数组的版本有点复杂:

create or replace function public.deletetVersion(item_list uuid[])
returns uuid[] language 'sql' as
$$
with t(d_id) as
(
  delete from version where id = any(item_list) returning id
)
select array_agg(d_id) from t;
$$;

并且 - 正如@Ibrahimshamma所说 - 你可能需要将参数转换为

uuid[]

© www.soinside.com 2019 - 2024. All rights reserved.