2013-12-12 13 views
5

Tôi muốn trả lại thông báo lỗi từ một thủ tục khi một ngoại lệ xảy ra. Trong SQL Server, bạn sẽ chọn Error_Number() và Error_Message(). Tôi sẽ làm điều đó như thế nào trong FirebirdSqlTrong FirebirdSql, cách trả lại thông báo ngoại lệ từ thủ tục

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

Bạn chỉ đơn giản là không thể ca tch ngoại lệ, nó sẽ bong bóng cho người gọi. –

+0

Tôi muốn định dạng tin nhắn và mã lỗi. Ứng dụng web dành cho mạng nội bộ của nó – edepperson

Trả lời

4

Thật không may bạn sẽ cần làm điều đó ở phía khách hàng, vì hiện tại không thể có được điều này trong PSQL. Có một feature request trong bộ theo dõi Firebird, mà đã được thực hiện cho Firebird 4, dự kiến ​​sẽ được phát hành vào năm 2017.

Xem Firebird 4 Alpha 1 release notes, section System Function RDB$ERROR() (cảnh báo: liên kết có thể phá vỡ với việc phát hành alpha tiếp theo):

Hàm RDB$ERROR() lấy bối cảnh lỗi PSQL làm đầu vào và trả về ngữ cảnh cụ thể của ngoại lệ hoạt động. Phạm vi của nó là được giới hạn trong bối cảnh của khối xử lý ngoại lệ trong PSQL. Bên ngoài khối xử lý ngoại lệ, RDB$ERROR luôn chứa NULL.

Loại giá trị trả lại tùy thuộc vào ngữ cảnh.

Rules Cú pháp

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

[..]

Ví dụ

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

Vâng, tôi chắc chắn muốn câu trả lời của bạn không đúng, nhưng vì bây giờ, tôi sẽ cung cấp cho bạn tín dụng cho nó – 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

Các vấn đề liên quan