例: トレース テーブルを使用したUDFのデバッグ - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/qwr1571437338192.ditamap
dita:ditavalPath
ja-JP/qwr1571437338192.ditaval
dita:id
B035-1147
Product Category
Software
Teradata Vantage

次の文は、UDFがトレース出力を書き込むためのTrace_Output列を定義するトレース テーブルを作成するものです。

CREATE GLOBAL TEMPORARY TRACE TABLE UDF_Trace
  (vproc_ID BYTE(2)
  ,Sequence INTEGER
  ,Trace_Output      VARCHAR(256))
ON COMMIT DELETE ROWS;

次のコードでは、トレース文字列の値を使用することにより、デバッグのレベルを決定しています。

#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
  
void Find_Text ( VARCHAR_LATIN   *searched_string,
                 VARCHAR_LATIN   *pattern,
                 CHARACTER_LATIN *result,
                 int             *indicator_searched_string,
                 int             *indicator_pattern,
                 int             *indicator_result,
                 char            sqlstate[6],
                 SQL_TEXT        fncname[129],
                 SQL_TEXT        sfncname[129],
                 SQL_TEXT        error_message[257] )
{

    SQL_TEXT trace_string[257];
    char     trace_output[257];
    void     *argv[1];
    int      length[1];
    char     debug_level = '0';
 
    /* Get the trace string specified by SET SESSION FUNCTION */
    /* TRACE and use it to determine debug level.             */
    FNC_Trace_String(trace_string);
    if (trace_string[0] != 0)
        debug_level = trace_string[0];

     ...
   
    switch (debug_level)
    {
      case '1':
        /* Debug Level 1: Output the function name */
        sprintf(trace_output, "Function: %s", sfncname);
        break;
      case '2':
        /* Debug Level 1: Output all values */
        sprintf(trace_output,
                "Function: %s, string: %s, pattern: %s",
                sfncname, searched_string, pattern);
        break;
    }
 
     ...

    /* Output the trace string to the trace table. */
    argv[0] = trace_output;
    length[0] = strlen(trace_output);
    FNC_Trace_Write_DL(1, argv, length);
 
     ...
   
}

次の文では、UDF_Traceテーブルのトレース出力を有効にし、トレース文字列を2に設定することにより、UDFがすべての値をトレース テーブルに出力するようにしています。

SET SESSION FUNCTION TRACE USING '2' FOR TABLE UDF_Trace;

SET SESSION FUNCTION TRACE文を実行すると、それまで有効だったすべてのトレース テーブルが無効になります。

次の文は、トレース テーブルに対する問合わせを実行することにより、UDFからのトレース出力を取り出します。

SELECT *
FROM UDF_Trace
ORDER BY 1, 2;