Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - SQL 用法 » 存储过程、触发器、批处理和用户定义的函数 » 错误和警告处理

 

示例:创建可由异常处理程序调用的错误记录过程

可定义可在应用程序间的异常处理程序中使用的错误记录过程,以进行统一错误记录。

  1. 在每次运行错误记录过程时,创建下列表来记录错误信息。



    CREATE TABLE IF NOT EXISTS error_info_table (
       idx INTEGER, 
       In UNSIGNED INTEGER, 
       code INTEGER, 
       state CHAR(5),
       err_msg CHAR(256),
       name CHAR(257),
       err_stack LONG VARCHAR,
       traceback LONG VARCHAR
    );
    CREATE TABLE IF NOT EXISTS error_stack_trace_table (
       idx UNSIGNED SMALLINT NOT NULL,
       stack_level UNSIGNED SMALLINT NOT NULL,
       user_name VARCHAR(128),
       proc_name VARCHAR(128),
       line_number UNSIGNED INTEGER NOT NULL,
       is_resignal BIT NOT NULL, PRIMARY KEY (idx, stack_level)
    );
  2. 创建以下过程,用于将错误信息记录到 error_info_table 和 error_stack_trace_table 并将消息写入到数据库服务器消息窗口:



    CREATE OR REPLACE PROCEDURE error_report_proc ( IN location_indicator INTEGER )
    NO RESULT SET
    BEGIN
       INSERT INTO error_info_table VALUES (
         location_indicator,
         ERROR_LINE(),
         ERROR_SQLCODE(), 
         ERROR_SQLSTATE(),
         ERROR_MESSAGE(),
         ERROR_PROCEDURE(),
         ERROR_STACK_TRACE(),
         TRACEBACK()
       );
       INSERT INTO error_stack_trace_table 
         SELECT location_indicator, *
         FROM sa_error_stack_trace() ;
       MESSAGE 'The error message is '|| ERROR_MESSAGE() ||' and the stack trace is '|| ERROR_STACK_TRACE()
       TYPE WARNING TO CONSOLE ;
    END; 
  3. 创建一个与以下过程相似的过程,并从异常处理程序调用错误记录过程。



    CREATE OR REPLACE PROCEDURE MyProc()
    BEGIN
       DECLARE column_not_found
         EXCEPTION FOR SQLSTATE '52003';
       MESSAGE 'Hello from MyProc.' TO CLIENT;
       SIGNAL column_not_found;
       MESSAGE 'Line following SIGNAL.' TO CLIENT;
    EXCEPTION
    WHEN column_not_found THEN
       MESSAGE 'Column not found handling.' TO CLIENT;
       CALL error_report_proc();
    END ;    
 另请参见