运用场景:
1、DB2 数据库中的记录被更改。
2、如果这个更改使数据记录满足某些基于布尔逻辑的条件,数据库触发器将调用一个 Java UDF。
3、Java UDF 使用 WebService接口通知其他服务。
步骤1:创建表
create table zjyw.TTRD_UDF
(CODE varchar(30) not null,
NAME varchar(50) not null,
REMARK varchar(100) not null)
步骤2:测试数据
insert into zjyw.TTRD_UDF values('TF1501','TF1501','http://127.0.0.1:8080/Test');
insert into zjyw.TTRD_UDF values('TF1503','TF1503','http://127.0.0.1:8080/Test');
步骤3:新建JavaUDF.java
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import COM.ibm.db2.app.UDF;
public class JavaUDF extends UDF {
// private static final Logger logger = LoggerFactory.getLogger(JavaUDF.class);
/**
* 创建文件
* @param fileName
* @throws IOException
*/
public static void createFile(String fileName) throws IOException {
File f = new File(fileName);
if (!f.exists()) {
f.createNewFile();
}
}
/**
* 追加写文件
* @param fileName
* @param content
* @throws IOException
*/
public static void writeFile(String fileName, String content) throws IOException {
createFile(fileName);
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(fileName, true)));
out.write(content);
} finally {
if (out != null) {
out.close();
}
}
}
public static String send(String i_code, String i_name,
String i_code_new, String i_name_new) {
try {
writeFile("d:/test.txt", i_name + i_name_new);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// logger.info(input);
// sendWebService(""); // 未实现
return "OK";
}
}
编译JavaUDF.java,生成的JavaUDF.class拷贝到db2的FUNCTION目录下,如:C:\Program Files\IBM\SQLLIB\FUNCTION
打包成XQUANT-UDF.jar包
步骤4:注册jar包
call sqlj.install_jar('file:///d:/xquant/java/xQuant-UDF.jar','UDF')
步骤5:新建函数
create function zjyw.SENDMESSAGE(CODE varchar(30),
NAME varchar(50),
CODE_NEW varchar(30),
NAME_NEW varchar(50))
returns varchar(100)
fenced
variant
no sql
external action
language java
parameter style java
external name 'XQUANT-UDF:JavaUDF.send'
步骤6:触发器
CREATE TRIGGER ZJYW.AFTER_UPDATE_UFT
AFTER UPDATE OF NAME ON ZJYW.TTRD_UDF
REFERENCING OLD AS OLDROW NEW AS NEWROW
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
IF(NEWROW.NAME<>'')
THEN
VALUES(SENDMESSAGE(OLDROW.CODE,OLDROW.NAME,NEWROW.CODE,NEWROW.NAME));
END IF;
END;
步骤7:修改数据
update zjyw.TTRD_UDF set NAME='TF1506' where CODE='TF1503';
执行成功后会在db2服务器的D盘生成一个test.txt文件。