Bir Bağlam ile istisna oluşturma


13

PostgreSQL bir istisna attığında şöyle bir "CONTEXT" satırı vardır:

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

Ama bir istisna attığımda, bu çizgi orada değil. Nasıl ekleyeceğimi bulamadım.

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

Bu satırı istisnama eklemek mümkün mü?

Yanıtlar:


13

CONTEXTKullanıcı tanımlı bir istisna ile satır çıktısı için doğrudan bir yol bulamadım . Bu seçenek (henüz) PostgreSQL 9.1'de henüz uygulanmamıştır. Buradaki kılavuzu okuyun .
Ancak, bir ...

Geçici çözüm

... bu kusursuz bir şekilde gerçekleşmeli . Hatayı sizin için yükselten başka bir işlev çağırarak plpgsql'nin istediğiniz şekilde davranmasını sağlayabilirsiniz. Bu, PostgreSQL 9.0 veya sonraki sürümleriyle çalışır .
8.4 sürümü için küçük bir ayar yapmanız gerekir: Parametreler atanamaz.

Kullanıcı tanımlı bir mesajla bir hata (uyarı, uyarı, ..) oluşturma ve 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';

Aşağıdaki gibi bir hata oluşturmak için işlevi kullanın:

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;

Aramak:

SELECT test_err('wrong parameter');

Varsayılan değerler ve adlandırılmış parametreler

Sözdizimini geliştirdim ve işlev tanımına varsayılan değerler ekledim . Parametresiz (veya yalnızca bir tane) olmadan çağırırsanız ve eksik değerler için varsayılanlar kullanılır. İle birlikte adlandırılmış parametreleri , hemen hemen her şeyi yapabilir. Örnekler:

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.