2013-04-22 59 views
3

在我的触发器过程中,我使用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; 

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

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

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

CREATE TRIGGER hlidej_datum_kon 
AFTER INSERT OR UPDATE ON kontext 
FOR EACH ROW 
    EXECUTE PROCEDURE hlidej_datum_kon(); 
END; 

回答

4

有两个错误

  • raise语句的第一个参数是格式字符串 - 该字符串应该是恒定的。它可以包含替换符号'%',这些符号的值作为RAISE语句的其他参数放置。

  • 不应该使用ROLLBACK语句。 RAISE EXCEPTION抛出异常,并且ROLLBACK语句更新执行。你可以没有明确控制事务PL/pgSQL的 - 所以你不能用ROLLBACK或PLPGSQL COMMIT语句ever.You可以使用异常捕获

    BEGIN 
        RAISE EXCEPTION 'blabla'; 
    EXCEPTION WHEN some_exception_identif_see_list_of_exception_in_doc THEN 
        .. do some or do nothing 
    END; 
    
4

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

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