17.10 - CREATE GLOBAL TEMPORARY TRACE TABLEの例 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-171K-JPN
Language
日本語 (日本)

例: グローバル一時トレース テーブルの作成

この例では、グローバル一時トレース テーブルの必須列、およびいくつかの任意指定のアプリケーション固有列を定義します。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から選択され、関数トレースバックは正常に無効になりました。