Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
返回通向当前调用位置的堆栈跟踪。
sa_stack_trace( )
结果集中的每一个记录表示堆栈中的一个调用。如果复合语句不是过程、函数、触发器或事件的一部分,则返回批处理类型(watcom_batch 或 tsql_batch)而不返回过程名。
此过程返回的信息与 STACK_TRACE 函数返回的信息相同。
无
无。
以下示例显示如何从 sa_stack_trace 系统过程获得结果集列:
SELECT StackLevel, UserName, ProcName, LineNumber FROM sa_stack_trace();
在存储过程的上下文之外执行此语句时,结果集为空。
以下语句显示一个可将结果发送到客户端窗口的通用堆栈跟踪过程的实施。其中包括一个用法示例。
CREATE OR REPLACE PROCEDURE StackDump( MSG CHAR(128) ) BEGIN DECLARE myStackLevel UNSIGNED SMALLINT; DECLARE myUserName CHAR(128); DECLARE myProcName CHAR(128); DECLARE myLineNumber UNSIGNED SMALLINT; DECLARE err_notfound EXCEPTION FOR SQLSTATE '02000'; DECLARE myStack CURSOR FOR SELECT StackLevel, UserName, ProcName, LineNumber FROM sa_stack_trace(); MESSAGE 'Stack Trace: ' || MSG TO CLIENT; OPEN myStack; StackLoop: LOOP FETCH NEXT myStack INTO myStackLevel, myUserName, myProcName, myLineNumber; IF SQLSTATE = err_notfound THEN LEAVE StackLoop; END IF; IF myStackLevel != 1 THEN MESSAGE myStackLevel - 1 || ' ' || myUserName || ' ' || myProcName || ' ' || myLineNumber TO CLIENT; ENDIF END LOOP StackLoop; CLOSE myStack; END; CREATE OR REPLACE PROCEDURE Proc1() BEGIN CALL Proc2(); END; CREATE OR REPLACE PROCEDURE Proc2() BEGIN CALL Proc3(); END; CREATE OR REPLACE PROCEDURE Proc3() BEGIN CALL StackDump('Snapshot from Proc3'); END; CALL Proc1();
Interactive SQL [消息] 窗口输出如下所示。
Stack Trace: Snapshot from proc3 1 DBA proc3 3 2 DBA proc2 3 3 DBA proc1 3