Buat pengecualian dengan Konteks

13

Ketika PostgreSQL melempar pengecualian, ada baris "CONTEXT" seperti:

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

Tetapi ketika saya melempar pengecualian, baris ini tidak ada. Saya tidak menemukan cara menambahkannya.

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

Apakah mungkin menambahkan baris ini ke pengecualian saya?

Quentin
sumber

Jawaban:

13

Saya tidak bisa menemukan cara langsung untuk mengeluarkan CONTEXTbaris dengan pengecualian yang ditentukan pengguna. Opsi ini belum diterapkan (belum) di PostgreSQL 9.1. Baca manualnya di sini .
Namun, saya menemukan ...

Penanganan masalah

... yang seharusnya tampil sempurna . Anda dapat membuat plpgsql berperilaku seperti yang diinginkan dengan memanggil fungsi lain yang menimbulkan kesalahan untuk Anda. Ini berfungsi dengan PostgreSQL 9.0 atau lebih baru .
Untuk versi 8.4 Anda harus melakukan sedikit penyesuaian: Parameter tidak dapat ditetapkan.

Berfungsi untuk meningkatkan kesalahan (peringatan, pemberitahuan, ..) dengan pesan yang ditentukan pengguna dan 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';

Gunakan fungsi ini untuk meningkatkan kesalahan seperti ini:

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;

Panggilan:

SELECT test_err('wrong parameter');

Nilai default dan parameter bernama

Saya meningkatkan sintaks dan menambahkan nilai default ke definisi fungsi. Jika Anda memanggilnya tanpa parameter (atau hanya satu) dan standarnya akan digunakan untuk nilai yang hilang. Dalam kombinasi dengan parameter bernama , Anda dapat melakukan hampir semua hal. Contoh:

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