web-dev-qa-db-fra.com

Comment puis-je revenir une exception dans un bloc d'exception PL / PGSQL?

Considérez le bloc suivant (incomplet) de PL/PGSQL à l'intérieur d'une fonction:

CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
    RETURNS NUMERIC
    RETURNS NULL ON NULL INPUT
    IMMUTABLE
    LANGUAGE plpgsql
    AS $$
    BEGIN
        RETURN some_third_party_function(myvar1, myvar2);
    EXCEPTION WHEN internal_error THEN
        IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
            RETURN 0;
        ELSE
            -- Reraise the original exception here
            RAISE EXCEPTION '%', SQLERRM;
        END IF;
    END
    $$

Lorsqu'une erreur imprévue survient, ce code lancera une nouvelle exception avec le même message. Cependant, cela ne préservera pas le type ou le contexte d'origine.

Comment puis-je revenir ou retirez-vous l'exception originale non modifiée?

5
jpmc26

Vous pouvez utiliser RAISE sans aucun paramètre. Ceci est documenté sur les erreurs et les messages page:

La dernière variante de RAISE n'a aucun paramètre du tout. Ce formulaire ne peut être utilisé qu'à l'intérieur d'une clause BEGIN bloque EXCEPTION; Il provoque l'erreur actuellement manipulée pour être renvoyée.

CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
    RETURNS NUMERIC
    RETURNS NULL ON NULL INPUT
    IMMUTABLE
    LANGUAGE plpgsql
    AS $$
    BEGIN
        RETURN some_third_party_function(myvar1, myvar2);
    EXCEPTION WHEN internal_error THEN
        IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
            RETURN 0;
        ELSE
            -- Reraise the original exception here
            RAISE;
        END IF;
    END
    $$
5
jpmc26