使用 DB2 触发器和Java UDF实现业务通知

运用场景:

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文件。

时间: 2024-10-12 12:03:23

使用 DB2 触发器和Java UDF实现业务通知的相关文章

使用DB2自带的SOAP UDF实现业务通知

DB2自带了WebService客户端的实现,具体命令如下: 启用命令: db2enable_soap_udf -n dbName -u uID -p password [-force]The parameters have the following definitions:dbName - The database name to be enableduID user - ID for accessing the databasepassword - The password associa

db2触发器例子

-- 建表语句 CREATE TABLE WANGZSTABLE ( ID INTEGER NOT NULL, NAME VARCHAR(20) NOT NULL, AGE VARCHAR(20) NOT NULL, STATUS VARCHAR(10), CREATETIME TIMESTAMP, UPDATETIME TIMESTAMP, SENDTIME TIMESTAMP ); select * from wangzsTable; insert into WANGZSTABLE(id,n

oracle触发器调用java程序

1.创建java程序:接收存储过程传递的参数,发送socket通信. create or replace and compilejava source named jym as import java.io.BufferedReader; import java.io.InputStream; importjava.io.InputStreamReader; import java.io.OutputStream; import java.io.StringWriter; importjava.

Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: CURSOR  游标名  [ (参数名  数据类型,参数名 数据类型,...)]  IS  SELECT   语句; 例如:cursor c1 is select ename from emp; 游标

DB2触发器简单例子

db2使用版本9.7 创建A .B两个表,A表数据有更新.删除.插入时,将A表ID记录放入B表 1.create table A (id varchar(5),name varchar(30)); create table B (id varchar(5),name varchar(30)) 2.创建触发器 --插入时触动 CREATE TRIGGER administrator.tri_insert AFTER INSERT ON administrator.A REFERENCING NEW

oracle中触发器调用Java程序

1. 写一个Java程序,Java程序的目录是:E:\APP\test\src\test\Main.java 2. 在环境变量Path中配置,E:\studyInstallPath\oracle\BIN 3. 在E:\APP\test\src\test这个目录下执行 4. 5. 创建存储过程 create or replace procedure testmodify(name varchar2) as language Java name 'Main.modify(java.lang.Stri

DB2 触发器的写法及表主键结构的修改

DROP TRIGGER TR_MONTHLYCLOSING; CREATE TRIGGER TR_MONTHLYCLOSING NO CASCADE BEFORE INSERT ON PT_MONTHLYCLOSING REFERENCING NEW AS NEWROW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC IF (NEWROW.FLOWNO IS NULL) THEN SET NEWROW.FLOWNO = CURRENT DATE; END IF; E

Java并发之等待/通知机制

目录 1 前言 1.1 先来段代码放松一下 2 Object wait()/notify() 2.1 一段入门代码 2.2 问题三连击 a.为什么官方说wait() 要放在while里面? b.为什么wait()必须在同步方法/代码块中调用? c.为什么wait(), notify() 和 notifyAll()是定义在Object里面而不是在Thread里面? 2.3 wait(long timeout) 3 Condition await()/signal() 3.1 用Condition进

Java play freamwork 新闻通知的定时发送

package com.wanhua.thread;//定时发送任务线程import java.util.List;import java.util.TimerTask; import play.db.jpa.JPAPlugin; import controllers.News; import models.ChildrenNew;import models.Log;import models.New; public class SendNewsTask extends TimerTask {