以下の例では、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行を生成します。