Exception bei PostgreSQL

Hallo,

verstehe ich es richtig, dass es nicht möglich ist Exceptions im DECLARE-Bloch zu bestimmen und somit mehrfach auf einzelne Exceptions zugreifen zu können? Wie zB bei Oracle:

CREATE OR REPLACE FUNCTION  "CHECK" 
()
return INTEGER
as
PRAGMA AUTONOMOUS_TRANSACTION;
  num INTEGER;
  exception1 EXCEPTION;
  exception2 EXCEPTION;
begin
  IF --TEST-- THEN
     RAISE exception1;
  END IF;

  IF --TEST-- THEN
     RAISE exception1;
  END IF;

  IF --TEST-- THEN
     RAISE exception2;
  END IF;

  IF --TEST-- THEN
     RAISE exception2;
  END IF;

  RETURN num;

EXCEPTION
  WHEN exception1 THEN
      raise_application_error (-20012,'Error: ' || 'GLN already in use' || ' - ' || SQLERRM);
  WHEN exception2 THEN
      raise_application_error (-20012,'Error: ' || 'Invalid GLN' || ' - ' || SQLERRM);
  WHEN OTHERS THEN
      raise_application_error(-20001, 'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end;

Was Du meinst sind custom-exceptions … mit postgres kann man keine solchen deklarieren. Du kannst aber wie in pl/sql auch Exceptions auslösen. Such Dir einfach eine passende vordefinierte Exception aus:

PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: Porting from Oracle PL/SQL
PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: PostgreSQL Error Codes

Ich habe hier ein Thema zu meinem Problem gefunden:
Exceptions und Errors [Archive] - Informatik-Forum.at

Dort heißt es:

SQLERRM/add

EXCEPTION WHEN OTHERS THEN
RAISE EXCEPTION ‘%’, SQLERRM USING ERRCODE = SQLSTATE;
RETURN -1;
END

Was ist SQLERRM für ein Datentyp? Und warum kommt bei mir ein Fehler wenn ich das mache:

DECLARE 
  SQLERRM      NUMERIC;  --TEXT hat ich auch ausprobiert
BEGIN
  SELECT * From tab
  If not FOUND then
    RAISE EXCEPTION 'An error  - % ', SQLERRM USING ERRCODE = SQLSTATE;
  end if;
END;

FEHLER: Spalte »sqlstate« existiert nicht
LINE 1: SELECT SQLSTATE

Wie und als was kann ich SQLSTATE deklarieren?

Das ist bereits definiert:

PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: PostgreSQL Error Codes

Dieser Link hilft mir nicht! Ich weiß, dass SQLSTATE schon vordefiniert ist, aber meine Datenbanksystem scheint es nicht zu wiesen. Wie kann ich das Problem lösen?

In der Dokumentation zu pl/pgSQL sind auch einige Beispiele, wie du RAISE EXCEPTION verwendest.
Bist du diesen Beispielen mal gefolgt?

Also entweder habe ich sie übersehen/nicht gefunden oder sie haben mir auch nicht geholten. Wenn du möchtest kannst du mir gern einen Link schicken.

Will mir denn nimand Helfen? :frowning:

Ich habe u.a. diesen Link gefunden:
Fehlerbehandlung
Wie aber kann ich diese Fehlerabfragen machen? Damit z.B. kann er nichts anfangen:

if sqlca.sqlcode = 100 THEN
   -- Anweisungen
END IF;

FEHLER: fehlender Eintrag in FROM-Klausel für Tabelle »sqlca« LINE 1: SELECT sqlca.sqlcode = 100

Wie also macht man es richtig. Kann mir jemand ein Beispiel schreiben?

PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: Control Structures

Ja danke, das ist genau das, was ich gesucht habe.

Gibt es eine Fehlermeldung, wenn eine Select keine Daten gefunden hat? Auf “no_data_found” reagiert er nicht.

Du kannst mit GET DIAGNOSTICS abfragen wieviele rows das letzte Statement geliefert hat:

PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: Basic Statements

Das ist ja auch kein Fehler.

Lies doch mal bitte etwas ausführlicher in der Dokumentation, das ist dort alles erklärt und mit Beispielen hinterlegt:

PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: Basic Statements