异常中的字符串连接

Pav*_* V. 5 string postgresql-9.2

在我的触发程序中,我使用RAISE EXCEPTION作为消息.我对简单消息没有任何问题,但如果我想给用户一些更复杂的反馈,我就会面临一个问题:连接运算符在RAISE EXCEPTION语句中不起作用.

首先,我试过这个:

CREATE OR REPLACE FUNCTION hlidej_datum_kon() RETURNS trigger AS $$
DECLARE
  od date;
BEGIN
  SELECT a.datum_od FROM akce AS a WHERE a.kod_akce = (
    SELECT b.kod_akce FROM sj AS b WHERE b.kod_sj = NEW.kod_sj
  ) INTO od;
  IF NEW.datum < od THEN
    RAISE EXCEPTION 'Kontext nemohl být odkryt p?ed za?átkem akce ('||TO_CHAR(od)||')!'
    ROLLBACK;  
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

没工作.所以我试着将整个文本放到一个文本变量中,但是我没有找到如何将变量的内容放到异常语句中,以便将其打印为消息.

我的问题是:如何在PostgreSQL触发器函数中打印包含变量的消息?

为了完整起见,这是我的触发器:

CREATE TRIGGER hlidej_datum_kon
AFTER INSERT OR UPDATE ON kontext
FOR EACH ROW
  EXECUTE PROCEDURE hlidej_datum_kon();
END;
Run Code Online (Sandbox Code Playgroud)

Max*_*kov 8

你不需要使用concat.您可以使用通配符:

RAISE EXCEPTION 'Kontext nemohl být odkryt p?ed za?átkem akce (%)!', od;
Run Code Online (Sandbox Code Playgroud)


Pav*_*ule 6

有两个错误

  • RAISE语句的第一个参数是格式字符串 - 该字符串应该是常量.它可以包含替换符号'%',这些符号的值是RAISE语句的其他参数.

  • 不应该使用ROLLBACK语句.RAISE EXCEPTION抛出异常,ROLLBACK语句更新.您无法在PL/pgSQL中显式控制事务 - 因此您无法在plpgsql中使用ROLLBACK或COMMIT语句.您可以使用异常捕获

    BEGIN
       RAISE EXCEPTION 'blabla';
    EXCEPTION WHEN some_exception_identif_see_list_of_exception_in_doc THEN
        .. do some or do nothing
    END;
    
    Run Code Online (Sandbox Code Playgroud)