异常内的字符串连接

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

在我的触发程序中,我对消息使用“引发异常”。我对简单的消息没有问题,但如果我想给用户一些更复杂的反馈,我面临一个问题:串联运算符在 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;

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

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

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

CREATE TRIGGER hlidej_datum_kon
AFTER INSERT OR UPDATE ON kontext
FOR EACH ROW
  EXECUTE PROCEDURE hlidej_datum_kon();
END;
string postgresql-9.2
3个回答
21
投票

您不需要使用 concat。您可以使用通配符代替:

RAISE EXCEPTION 'Kontext nemohl být odkryt před začátkem akce (%)!', od;

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;
    

0
投票

如果你想RAISE NOTICE连接字符串,那么你可以使用:

RAISE NOTICE '%', ('some' | ' concatenated' | ' string');
© www.soinside.com 2019 - 2024. All rights reserved.