Postgresql

如何在 PL/pgSQL EXCEPTION 塊中重新引發異常?

  • January 30, 2019

考慮函式內的以下(不完整的)PL/pgSQL 塊:

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
   $$

當發生意外錯誤時,此程式碼將拋出具有相同消息的新異常。但是,它不會保留原始類型或上下文。

如何重新引發或重新拋出未修改的原始異常?

您可以RAISE不帶任何參數使用。這記錄在錯誤和消息頁面上:

的最後一個變體RAISE根本沒有參數。這種形式只能在BEGIN塊的EXCEPTION子句中使用;它會導致目前正在處理的錯誤被重新拋出。

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
   $$

引用自:https://dba.stackexchange.com/questions/228495