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 Messages] ウィンドウの出力を次に示します。
Stack Trace: Snapshot from proc3 1 DBA proc3 3 2 DBA proc2 3 3 DBA proc1 3