컨텍스트를 사용하여 예외 생성

PostgreSQL에서 예외가 발생하면 다음과 같은 “CONTEXT”줄이 있습니다.

    ERROR:  INSERT has more target COLUMNS than expressions
    LINE 3: ...
                                                         ^
    QUERY:  INSERT INTO ...
    CONTEXT:  PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement

그러나 예외를 던질 때이 줄은 없습니다. 그것을 추가하는 방법을 찾지 못했습니다.

    RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla';

이 줄을 내 예외에 추가 할 수 있습니까?



답변

CONTEXT사용자 정의 예외로 라인 을 출력하는 직접적인 방법을 찾을 수 없습니다 . 이 옵션은 PostgreSQL 9.1에서 아직 구현되지 않았습니다. 여기에서 설명서를 읽으십시오 .
그러나, 나는 발견했다 …

해결 방법

완벽하게 수행해야합니다 . 오류를 발생시키는 다른 함수를 호출하여 plpgsql을 원하는대로 작동시킬 수 있습니다. 이것은 PostgreSQL 9.0 이상에서 작동합니다 .
버전 8.4의 경우 약간 조정해야합니다. 매개 변수를 지정할 수 없습니다.

함수는 사용자 정의 된 메시지와 함께 (.. 경고 예고)에서 오류가 발생한다 CONTEXT:

CREATE OR REPLACE FUNCTION f_raise(_lvl text = 'EXCEPTION'
                                 , _msg text = 'Default error msg.')
  RETURNS void AS
$func$
BEGIN
   CASE upper(_lvl)
      WHEN 'EXCEPTION' THEN RAISE EXCEPTION '%', _msg;
      WHEN 'WARNING'   THEN RAISE WARNING   '%', _msg;
      WHEN 'NOTICE'    THEN RAISE NOTICE    '%', _msg;
      WHEN 'DEBUG'     THEN RAISE DEBUG     '%', _msg;
      WHEN 'LOG'       THEN RAISE LOG       '%', _msg;
      WHEN 'INFO'      THEN RAISE INFO      '%', _msg;
      ELSE RAISE EXCEPTION 'f_raise(): unexpected raise-level: "%"', _lvl;
   END CASE;
END
$func$  LANGUAGE plpgsql;

COMMENT ON FUNCTION f_raise(text, text) IS 'Raise error or given level with msg and context.
Call from inside another function instead of raising an error directly
  to get plpgsql to add CONTEXT (with line number) to error message.
$1 .. error level: EXCEPTION | WARNING | NOTICE | DEBUG | LOG | INFO
$2 .. error message';

이 함수를 사용하여 다음과 같은 오류를 발생시킵니다.

CREATE OR REPLACE FUNCTION test_err(text)
  RETURNS void AS
$func$
BEGIN
   -- do stuff    

   IF TRUE THEN  -- some condition here?
      -- instead of raising error like this:
      -- RAISE EXCEPTION 'unexpected parameter: "%"', $1;
      PERFORM f_raise('EXCEPTION', 'My message "' || $1 || '"');
   END IF;
END
$func$  LANGUAGE plpgsql;

요구:

SELECT test_err('wrong parameter');

기본값 및 명명 된 매개 변수

구문을 개선하고 함수 정의 에 기본값을 추가했습니다 . 매개 변수없이 (또는 하나만) 호출하면 누락 된 값에 기본값이 사용됩니다. 명명 된 매개 변수 와 함께 거의 모든 작업을 수행 할 수 있습니다. 예 :

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');