Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql/plpgsql-具有循环和多个操作的函数_Sql_Postgresql_Plpgsql - Fatal编程技术网

postgresql/plpgsql-具有循环和多个操作的函数

postgresql/plpgsql-具有循环和多个操作的函数,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我对Postgres还比较陌生,但我已经通过pgAdmin 4.15创建了一个函数,Postgres的版本是9.6。 问题是我不能让它工作,我认为语法有问题? INSERT和UPDATE语句正在工作(在函数外部),因此它必须是函数语法 其目的是通过jdbc插件(Logstash)调用此函数,并使用给定的“输入”字符串作为键更新某些表。 “键”用于选择要操作的报警ID。 因此,对于我获得的每个id,我需要对这些表执行一些更新/插入 # \sf close_event CREATE OR REPLA

我对Postgres还比较陌生,但我已经通过pgAdmin 4.15创建了一个函数,Postgres的版本是9.6。
问题是我不能让它工作,我认为语法有问题?
INSERT和UPDATE语句正在工作(在函数外部),因此它必须是函数语法

其目的是通过jdbc插件(Logstash)调用此函数,并使用给定的“输入”字符串作为键更新某些表。
“键”用于选择要操作的报警ID。
因此,对于我获得的每个id,我需要对这些表执行一些更新/插入

# \sf close_event
CREATE OR REPLACE FUNCTION public.close(input text)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
  _event_idnumber INTEGER;
BEGIN
  FOR _event_idnumber IN
    SELECT id FROM public.alerts WHERE data ->> 'field_name' = input
  LOOP
    INSERT INTO public.comments ( created_date, content, alert_id, user_id) VALUES (current_timestamp, 'text1 text', _event_idnumber, 1);
    INSERT INTO public.comments ( created_date, content, alert_id, user_id) VALUES (current_timestamp, 'text2 text.', _event_idnumber, 1);
    INSERT INTO public.analysis ( alert_id, created_date, last_updated, notes) VALUES (_event_idnumber, current_timestamp, current_timestamp, 'text3 text');
    UPDATE public.alerts SET status='DONE', outcome='completed', last_updated=current_timestamp, assigned_user_id=1 WHERE id = _event_idnumber;
    UPDATE public.alerts SET data = jsonb_set(data, '{other_field}'::text[], input::jsonb) WHERE id = _event_idnumber;
  END LOOP;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
END;
$function$;
我读过一些版本的postgres,我必须使用DO语句,但不知道如何使用。

在本页中,我将按照说明进行操作:

因为SQL是一种基于集合的语言,用于直接的逻辑操作,所以您应该在集合中处理追加和更新,而不是如注释所示的迭代循环调用。因此,将过程语言
plpgsql
转换为纯
sql
。具体来说,考虑使用并结合UPDATE语句来选择插入。
CREATE OR REPLACE FUNCTION public.close(input text)
 RETURNS void
 LANGUAGE sql
AS $function$

   -- COMMENTS INSERT
   INSERT INTO public.comments (created_date, content, alert_id, user_id) 
   SELECT current_timestamp, 'text1 text', a.id, 1
   FROM public.alerts a
   WHERE a.data ->> 'field_name' = input

   UNION ALL

   SELECT current_timestamp, 'text2 text.', a.id, 1
   FROM public.alerts a
   WHERE a.data ->> 'field_name' = input;

   -- ANALYSIS INSERT
   INSERT INTO public.analysis (alert_id, created_date, last_updated, notes) 
   SELECT a.id, current_timestamp, current_timestamp, 'text3 text'
   FROM public.alerts a
   WHERE a.data ->> 'field_name' = input;

   -- ALERTS UPDATE
   UPDATE public.alerts a
   SET status='DONE', 
       outcome='completed', 
       last_updated=current_timestamp, 
       assigned_user_id=1,
       data = jsonb_set(data, '{other_field}'::text[], input::jsonb) 
   WHERE a.data ->> 'field_name' = input;

$function$;

(使用random
mydata
表中的40
'postgres'
行)

您不需要循环或函数,您还需要更具体地说明您要完成的任务。代码只会告诉我们您实现了什么,而不是您的意图。是的!谢谢您的解决方案非常完美,我只将
data=jsonb_集(data,{other_field}'::text[]中的
data
列的最后一次更新更改为_json(input::text)::jsonb)
,因为它需要一个json字符串。非常高兴听到这个消息并乐于提供帮助!快乐编码!