Tạo một ngoại lệ với một bối cảnh


13

Khi PostgreSQL ném một ngoại lệ, có một dòng "TIẾP THEO" như:

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

Nhưng khi tôi ném một ngoại lệ, dòng này không có ở đó. Tôi đã không tìm thấy làm thế nào để thêm nó.

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

Có thể thêm dòng này vào ngoại lệ của tôi?

Câu trả lời:


13

Tôi không thể tìm thấy một cách trực tiếp để xuất CONTEXTdòng với ngoại lệ do người dùng xác định. Tùy chọn này chỉ chưa được triển khai (chưa) trong PostgreSQL 9.1. Đọc hướng dẫn ở đây .
Tuy nhiên, tôi đã tìm thấy một ...

Cách giải quyết

... Điều đó sẽ thực hiện hoàn hảo . Bạn có thể làm cho plpgsql hoạt động như mong muốn bằng cách gọi một hàm khác gây ra lỗi cho bạn. Điều này hoạt động với PostgreSQL 9.0 trở lên .
Đối với phiên bản 8.4, bạn phải điều chỉnh nhỏ: Không thể gán tham số.

Chức năng đưa ra lỗi (cảnh báo, thông báo, ..) với thông báo do người dùng xác định và 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';

Sử dụng chức năng để đưa ra một lỗi như thế này:

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;

Gọi:

SELECT test_err('wrong parameter');

Giá trị mặc định và tham số được đặt tên

Tôi đã cải thiện cú pháp và thêm các giá trị mặc định cho định nghĩa hàm. Nếu bạn gọi nó mà không có tham số (hoặc chỉ một) và mặc định sẽ được sử dụng cho các giá trị bị thiếu. Kết hợp với các tham số được đặt tên , bạn có thể làm khá nhiều thứ. Ví dụ:

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.