2013-12-12 14 views
5

zurückgegeben wird Ich möchte die Fehlermeldung von einer Prozedur zurückgeben, wenn eine Ausnahme auftritt. In SQL Server würden Sie die Error_Number() und Error_Message() auswählen. Wie würde ich es in FirebirdSQL tunIn FirebirdSql, wie Ausnahmebedingungsnachricht von Prozedur

SET TERM^; 

CREATE PROCEDURE sprocname 
(id int) 
RETURNS 
(gcode int, errmsg varchar(250)) 
AS 
BEGIN 
    gcode = 0; 
    errmsg = ''; 
    -- do procedure code here 


    WHEN ANY DO 
    BEGIN 
    gcode = gdscode; -- ?? 
    errmsg = ??; 
    END 
    SUSPEND; 
END^ 

SET TERM ;^
+0

Sie konnte einfach nicht ca tch die Ausnahme, wird es zum Anrufer sprudeln. –

+0

Ich möchte die Nachricht und den Fehlercode formatieren. Es ist für eine Intranet-Web-App – edepperson

Antwort

4

Leider müssen Sie, dass auf der Clientseite tun, da es zur Zeit nicht möglich ist, diese in PSQL zu erhalten. Es gibt ein feature request im Firebird-Tracker, die für Firebird 4 umgesetzt wurden, die voraussichtlich im Jahr 2017

Firebird 4 Alpha 1 release notes, section System Function RDB$ERROR() Siehe freigegeben werden (Achtung: Link könnte mit der nächsten Alpha-Release brechen):

Die Funktion RDB$ERROR() nimmt einen PSQL-Fehlerkontext als Eingabe und gibt den spezifischen Kontext der aktiven Ausnahme zurück. Ihr Gültigkeitsbereich ist , der auf den Kontext des Ausnahmebehandlungsblocks in PSQL beschränkt ist. Außerhalb des Ausnahmebehandlungsblocks enthält RDB$ERROR immer NULL.

Der Typ des Rückgabewerts hängt vom Kontext ab.

Syntaxregeln

RDB$ERROR (context) 
context ::= { GDSCODE | SQLCODE | SQLSTATE | EXCEPTION | MESSAGE } 

[..]

Beispiel

BEGIN 
    ... 
WHEN ANY DO 
    EXECUTE PROCEDURE P_LOG_EXCEPTION(RDB$ERROR(MESSAGE)); 
END 
+0

Nun, ich wünschte, Ihre war nicht die richtige Antwort, aber da es für jetzt ist, werde ich Ihnen Kredit dafür geben – edepperson

0
CREATE PROCEDURE ADD_COUNTRY (
    ACountryName COUNTRYNAME, 
    ACurrency VARCHAR(10)) 
AS 
BEGIN 
    INSERT INTO country (country, 
         currency) 
    VALUES (:ACountryName, 
      :ACurrency); 
    WHEN ANY DO 
    BEGIN 
     -- write an error in log 
    IN AUTONOMOUS TRANSACTION DO 
     INSERT INTO ERROR_LOG (PSQL_MODULE, 
          GDS_CODE, 
          SQL_CODE, 
          SQL_STATE) 
     VALUES ('ADD_COUNTRY', 
       GDSCODE, 
       SQLCODE, 
       SQLSTATE); 
    -- Re-throw exception 
    EXCEPTION; 
    END 
END 

http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-handleexceptions.html