在PL/pgSQL函数中不执行任何操作的ON冲突的返回值 [英] Return value for ON CONFLICT DO NOTHING in PL/pgSQL function

查看:18
本文介绍了在PL/pgSQL函数中不执行任何操作的ON冲突的返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

按照this评论的指示。

CREATE OR REPLACE FUNCTION test_upsert(
        _parent_id int, 
        _some_text text)
  RETURNS text
  LANGUAGE plpgsql AS
$func$
DECLARE
   a text;
BEGIN
   INSERT INTO parent_tree (parent_id, some_text)
   VALUES (_parent_id,_some_text)
   ON     CONFLICT DO NOTHING
   RETURNING 'ok' into a;
   return a;
   IF NOT FOUND THEN return 'JUZ ISTNIEJE';
   END IF;
END
$func$;
  1. 不确定这是什么意思:

    IF NOT FOUND THEN return 'JUZ ISTNIEJE';

  2. 如果没有冲突,则返回ok,这是合理的。但当发生冲突时,它将产生NULL。是否可以同时让on conflict do nothing同时返回not ok,或者在发生冲突时只返回raise notice parent_id should be unique

推荐答案

我现在更新了my referenced answer以修复一个错误,该错误似乎是造成混淆的主要原因。

  1. 不确定IF NOT FOUND THEN return 'JUZ ISTNIEJE';是什么意思?
JUZ ISTNIEJE";是波兰语,意思是&已经存在&--这就是操作员想要返回的。唯一的问题是返回一个有意义的文本,而不是什么都不返回(NULL)--这似乎解决了您的下一个问题:

  1. 如果没有冲突,则返回ok,这是有意义的。但当发生冲突时,它将产生零。是否可以同时拥有on conflict do nothing并返回not ok,或者当发生冲突时,只返回raise notice parent_id should be unique
是的,这就是我那边的答案,现在它已经解决了。您的函数变为:

CREATE OR REPLACE FUNCTION test_upsert(_parent_id int, _some_text text)
  RETURNS text
  LANGUAGE plpgsql AS
$func$
BEGIN
   INSERT INTO parent_tree (parent_id, some_text)
   VALUES (_parent_id,_some_text)
   ON     CONFLICT DO NOTHING;
   
   IF FOUND THEN
      RETURN 'ok';
   ELSE
      RAISE NOTICE 'parent_id already exists: %', _parent_id;  -- optional!
      RETURN 'not ok';  -- or whatever
   END IF;
END
$func$;

这篇关于在PL/pgSQL函数中不执行任何操作的ON冲突的返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆