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

vwkv1x7d  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(188)

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

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$;

如果您的数据库中有一个数据库,那么您可以使用以下方法来删除数据库:
但我得到了一个错误,如:
谁来帮帮我

ERROR:  function deletetversion(text[]) does not exist
utugiqy6

utugiqy61#

这是因为

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$;
b09cbbtk

b09cbbtk2#

您的函数应该返回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[]

相关问题