2013-12-12 22 views
5

Desidero restituire il messaggio di errore da una procedura quando si verifica un'eccezione. In SQL Server dovresti selezionare Error_Number() e Error_Message(). Come potrei farlo in FirebirdSQLIn FirebirdSql, come restituire il messaggio di eccezione dalla procedura

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

Si potrebbe semplicemente non ca con l'eccezione, bolla al chiamante. –

+0

Voglio formattare il messaggio e il codice di errore. È per un'applicazione web intranet – edepperson

risposta

4

Purtroppo avrete bisogno di farlo sul lato client, in quanto non è attualmente possibile ottenere questo in PSQL. C'è un feature request nel inseguitore Firebird, che è stato attuato per Firebird 4, che dovrebbe essere rilasciato nel 2017.

Vedi Firebird 4 Alpha 1 release notes, section System Function RDB$ERROR() (attenzione: link potrebbe rompere con la prossima release alpha):

La funzione RDB$ERROR() accetta un contesto di errore PSQL come input e restituisce il contesto specifico dell'eccezione attiva. Il suo scopo è limitato al contesto del blocco di gestione delle eccezioni in PSQL. Al di fuori del blocco di gestione delle eccezioni, RDB$ERROR contiene sempre NULL.

Il tipo di valore restituito dipende dal contesto.

Regole di sintassi

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

[..]

Esempio

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

Beh, certo che la tua non è stata la risposta corretta, ma dal momento che è, per ora, ti darò credito per questo – 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