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