例: グローバル一時トレース テーブルの作成
この例では、グローバル一時トレース テーブルの必須列、およびいくつかの任意指定のアプリケーション固有列を定義します。udf_testを実体化するトランザクションがコミットされると、その内容は削除されます。
CREATE GLOBAL TEMPORARY TRACE TABLE udf_test ( proc_ID BYTE(2), sequence INTEGER, udf_name CHARACTER(15), in_quantity INTEGER, trace_val1 FLOAT, trace_text CHARACTER(30)) ON COMMIT DELETE ROWS;
udf_testに記録された結果を検索する簡単な問合わせは、以下のようになります。
SELECT * FROM udf_test ORDER BY proc_id ASC, sequence ASC;
例: トレース テーブルの作成
以下の例では、関数の出力を取得するための単一列の可変長文字列を持つ単純なトレース テーブルを定義します。
この単一VARCHAR列のアプローチは、特定の単一目的トレース テーブル列の定義を使用しないので、さまざまな関数が使用できる柔軟性のあるトレース出力に向いています。
CREATE GLOBAL TEMPORARY TRACE TABLE udf_test, NO LOG ( proc_ID BYTE(2), sequence INTEGER, trace_string VARCHAR(256)) ON COMMIT DELETE ROWS;
例: 関数トレースバックの詳細なシナリオ
次の簡単なストアド プロシージャのトレース例は、プロシージャをデバッグするためのグローバル一時トレース テーブルの使用に関するさまざまな面を示す詳細なシナリオです。
BTEQを使用したSHOW FUNCTIONリクエストの実行により返される、次のCREATE FUNCTIONリクエストは、この例に使用されたトレースバックUDFを定義しています。使用するアプリケーションに応じて、プロシージャを簡単にも複雑にもできます。この特定のトレースUDFは、非常に簡単です。
SHOW FUNCTION sptrace;
*** Text of DDL statement returned.
*** Total elapsed time was 1 second.
------------------------------------------------------------------
CREATE FUNCTION sptrace (
p1 VARCHAR(100) CHARACTER SET LATIN)
RETURNS INTEGER
SPECIFIC sptrace
LANGUAGE C
NO SQL
PARAMETER STYLE TD_GENERAL
NOT DETERMINISTIC
RETURNS NULL ON NULL INPUT
EXTERNAL NAME sptrace
*** Text of DDL statement returned.
------------------------------------------------------------------
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
/*
Install in SYSLIB for general use and change to NOT PROTECTED mode
ALTER FUNCTION sptrace EXECUTE NOT PROTECTED;
*/
/* Assumes that the following trace table has been created */
/*
CREATE MULTISET GLOBAL TEMPORARY TRACE TABLE tracetst,
NO FALLBACK, NO LOG (
proc_id BYTE(2),
sequence INTEGER,
trace_str VARCHAR(100))
ON COMMIT PRESERVE ROWS;
Turn on tracing with following SQL (decide what your options mean):
SET SESSION FUNCTION TRACE USING 'T' FOR TABLE tracetst;
*/
void sptrace(VARCHAR_LATIN *trace_text,
INTEGER *result,
char sqlstate[6])
{
SQL_TEXT trace_string[257];
void *argv[20]; /* only need 1 arg -- its an array */
int length[20]; /* one length for each argument */
int tracelen;
/* read trace string */
FNC_Trace_String(trace_string);
/* Get length of string */
tracelen = strlen(trace_string);
/* Make sure tracing is turned on */
if (tracelen == 0)
return;
if (trace_string[0] == 'T')
{
argv[0] = trace_text;
length[0] = strlen(trace_text) +1;
/* Have something to trace */
FNC_Trace_Write_DL(1, argv, length);
}
}
次のSQLテキストは、トレース関数sptracedemoを呼び出すプロシージャを定義します。
SHOW PROCEDURE sptracedemo;
*** Text of DDL statement returned.
*** Total elapsed time was 1 second.
-----------------------------------------------------------------
CREATE PROCEDURE sptracedemo (
num_rows INTEGER )
BEGIN
-- Teradata mode SQL procedure
DECLARE dummy INTEGER;
DECLARE start_val INTEGER;
DECLARE fnum FLOAT;
SET dummy = sptrace('Start of sptrace demo');
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '52010'
BEGIN
-- Table already exists, delete the contents
DELETE sp_demo1 ALL;
SET dummy=sptrace('Deleted contents of sp_demo1 in handler');
-- Get error here and procedure will exit
END;
CREATE TABLE sp_demo1 (
a INTEGER,
b FLOAT);
SET dummy = sptrace('Table sp_demo1 created');
END;
SET start_val = 1;
SET fnum = 25.3;
WHILE start_val <= num_rows DO
INSERT INTO sp_demo1 (start_val, fnum);
SET dummy = sptrace('did: insert (' || start_val ||','|| fnum
||');');
SET start_val = start_val +1;
SET fnum = sqrt(fnum);
END WHILE;
SET dummy = sptrace('Got to end of sptrace demo'); END;
シナリオの残りの部分は、実際の例で構成されています。
グローバル一時トレース テーブルは、常に固定されている最初の2行を除いてユーザー定義です。
最初に、この例に使用されるグローバル一時トレース テーブルtracetstの定義を示します。
SHOW TABLE tracetst; *** Text of DDL statement returned. *** Total elapsed time was 1 second. ------------------------------------------------------------------- CREATE MULTISET GLOBAL TEMPORARY TRACE TABLE tracetst,NO FALLBACK, CHECKSUM = DEFAULT, NO LOG ( proc_id BYTE(2), sequence INTEGER, trace_str VARCHAR(100) CHARACTER SET LATIN NOT CASESPECIFIC) ON COMMIT PRESERVE ROWS;
次のリクエストでは、セッションの関数トレースバックが有効になります(追加情報については、SET SESSION FUNCTION TRACEを参照)。変数tは、使用しているトレースUDFで解釈されるユーザー定義文字列で、最長255文字までを指定できます。
SET SESSION FUNCTION TRACE USING 't' FOR TABLE tracetst; *** Set SESSION accepted. *** Total elapsed time was 1 second.
関数トレースバックがセッションに対して有効になりました。
ここで、グローバル一時トレース テーブルtracetstの内容を選択して、行がないことを確認します。
SELECT * FROM tracetst ORDER BY 1, 2; *** Query completed. No rows found. *** Total elapsed time was 1 second.
トレース テーブルが空です。
定義がこの例の最後のSHOW PROCEDUREリクエストで示されている、トレース プロシージャsptracedemoを実行します。
CALL sptracedemo(3); *** Procedure has been executed. *** Total elapsed time was 1 second.
プロシージャの実行後に、グローバル一時トレース テーブルtracetstの内容を選択します。プロシージャ定義を参照し、正確なトレース内容を確認します。
SELECT * FROM tracetst ORDER BY 1, 2; *** Query completed. 6 rows found. 3 columns returned. *** Total elapsed time was 1 second. proc_id Sequence trace_str ------- -------- ------------------------------------------------- FF3F 1 Start of sptrace demo FF3F 2 Table sp_demo1 created FF3F 3 did: insert ( 1, 2.53000000000000E 001); FF3F 4 did: insert ( 2, 5.02991053598372E 000); FF3F 5 did: insert ( 3, 2.24274620409526E 000); FF3F 6 Got to end of sptrace demo
ここで再度sptracedemoを呼び出します。
CALL sptracedemo(3); *** Procedure has been executed. *** Total elapsed time was 1 second.
グローバル一時トレース テーブルの内容を再度選択します。今回は、グローバル一時トレース テーブルに行が入っているため、別のパスになることに注意します。
SELECT * FROM tracetst ORDER BY 1, 2; *** Query completed. 12 rows found. 3 columns returned. *** Total elapsed time was 1 second. proc_id Sequence trace_str ------- -------- ------------------------------------------------ FF3F 1 Start of sptrace demo FF3F 2 Table sp_demo1 created FF3F 3 did: insert ( 1, 2.53000000000000E 001); FF3F 4 did: insert ( 2, 5.02991053598372E 000); FF3F 5 did: insert ( 3, 2.24274620409526E 000); FF3F 6 Got to end of sptrace demo FF3F 7 Start of sptrace demo FF3F 8 deleted contents of sp_demo1 in handler FF3F 9 did: insert ( 1, 2.53000000000000E 001); FF3F 10 did: insert ( 2, 5.02991053598372E 000); FF3F 11 did: insert ( 3, 2.24274620409526E 000); FF3F 12 Got to end of sptrace demo
関数トレースバックを無効にして、プロシージャが呼び出されているが関数トレースバックが有効になっていないときに、トレース テーブルには何も追記されていないことを示します。
SET SESSION FUNCTION TRACE OFF; *** Set SESSION accepted. *** Total elapsed time was 1 second. CALL sptracedemo(3); *** Procedure has been executed. *** Total elapsed time was 1 second. SELECT * FROM tracetst ORDER BY 1, 2; *** Query completed. 12 rows found. 3 columns returned. *** Total elapsed time was 1 second. proc_id Sequence trace_str ------- -------- ------------------------------------------------ FF3F 1 Start of sptrace demo FF3F 2 Table sp_demo1 created FF3F 3 did: insert ( 1, 2.53000000000000E 001); FF3F 4 did: insert ( 2, 5.02991053598372E 000); FF3F 5 did: insert ( 3, 2.24274620409526E 000); FF3F 6 Got to end of sptrace demo FF3F 7 Start of sptrace demo FF3F 8 deleted contents of sp_demo1 in handler FF3F 9 did: insert ( 1, 2.53000000000000E 001); FF3F 10 did: insert ( 2, 5.02991053598372E 000); FF3F 11 did: insert ( 3, 2.24274620409526E 000); FF3F 12 Got to end of sptrace demo
同じ12行がtracetstから選択され、関数トレースバックは正常に無効になりました。