17.10 - 例: トリガーからのUDFの呼び出し - 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
日本語 (日本)

以下の例では、firstlerrという名前のユーザー定義関数(内部形式)をトリガーから呼び出します。

この目的に適ったCREATE TABLE定義を次に示します。

     CREATE TABLE trg_udf007_04 (
       a INTEGER, 
       b FLOAT);
     CREATE TABLE trg_udf007_03 (
       a INTEGER, 
       b FLOAT);
     CREATE TABLE trg_udf007_01 (
       a INTEGER, 
       b FLOAT);

trg_udf007_01に行を挿入します。

     INSERT INTO trg_udf007_01 
     VALUES (4, 2.5);

以下のUDF本体を作成します。

#define SQL_TEXT Latin_Text
#include <udfdefs.h>
 /* Select statement:
 CREATE FUNCTION first1err(integer, float)
RETURNS float
LANGUAGE C
NO SQL
EXTERNAL NAME 'sc!first1err!first1err.c';
 */
void first1err(INTEGER  *a,
FLOAT    *b,
FLOAT    *result,
int      *indc_a,
int      *indc_b,
int      *indc_result,
char     sqlstate[6],
SQL_TEXT extname[129],
SQL_TEXT specific_name[129],
SQL_TEXT error_message[257])
{
if (*indc_a == -1 || *indc_b == -1)
{
*indc_result = -1;
return;
}
*result = *a + *b;
*indc_result = 0;
/* handle warning */
if (*a == -1 )
{
      strcpy(sqlstate, "01H01");
      strcpy((char *) error_message, "You have been warned no nulls");
      return;
}
       /* create a divide fault */
    if (*a == -2 )
      {
      int  f2 = 2;
      int  f1 = 0;
 volatile       int  f3 = 99999;
      f3 = f2/f1;
      if (f3 < 0)
          f3 = 5; 
      return;
      }
    if ( *result < 0.0 )
      {
      strcpy(sqlstate, "22H01");
      strcpy((char *) error_message, "This is a user created error.");
      return;
      }
}

以下のトリガーを作成します。

     CREATE TRIGGER trg_udf007_01_trigger
       AFTER INSERT ON trg_udf007_03 
       REFERENCING NEW AS cur
     FOR EACH ROW
       WHEN ( 11 > first1err(cur.a, cur.b))
      (INSERT INTO trg_udf007_04 (cur.a, cur.b); 
      );

このトリガー定義のWHEN句はfirstlerrという名前のUDFを呼び出すので、注意が必要です。

以下のINSERTリクエストを実行します。

     INSERT INTO trg_udf007_03 
       SELECT * 
       FROM trg_udf007_01;

この出力はtrg_udf007_03に1行、trg_udf007_04に1行を生成します。