oracle触发器和webservice数据推送

简介: oracle触发器和webservice数据推送

最近接手一个古老的javaweb项目,项目中使用了axis的方式调用webservice,实现数据推送,但是由于客户提供的资料只有wsdl文件,所以就采用了相对熟悉的cxf方式创建webservice客户端。因为已有axis的jar包,所以中间也是摸索了好几个小时。本文主要介绍cxf在axis的基础上创建webservice客户端,同时总结oracle触发器。


一、触发器

1.触发器介绍

create [or replace] trigger trigger_name
{before | after} trigger_event
on table_name
[for each row]
[when trigger_condition]
trigger_body

trigger_name:触发器名称


before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发


trigger_event:触发事件,在DML触发器中主要为insert、update、delete等


table_name:表名,表示发生触发器作用的对象,也可以指定为视图名称


for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器


when trigger_condition:添加的触发条件


trigger_body:触发体


2.触发器应用场景

2.1 数据同步


我有两个系统,其中系统A负责插入数据,但是系统B也想获得这些新增的数据,并且做到数据同步性,这该怎么做呢,此时,我们就可以使用触发器,当A往表中插入数据时,把数据同步到B库中去,B中可以使用标志字段确保这个数据是否已读,或者做一张临时表,永远存储A库触发过来的新增数据。B系统定时任务去取这张临时表。


场景一、当我们往employee插入一条数据的时候,就往employee_bak同步插入一条数据


create or replace trigger trigger_policy  ---触发器名称
before insert on employee              ---在新增之前进行操作,也有after属性
for each row                           ---每改动一行就同步下数据
begin
--------------具体同步过程,:new.id新增的那条数据,获取数据中的id
  insert into employee_bak (id,name,birthday,address)      
  values(:new.id,:new.name,:new.birthday,:new.address);
end;

oracle中的快照备份是异步的。 而利用触发器,是同步的。

场景二、当我们删除employee表的数据后,自动向操作日志表log表插入一条数据

CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;
CREATE OR REPLACE TRIGGER employee_log
 BEFORE DELETE --指定触发时机为删除操作前触发
 ON employee
 FOR EACH ROW --说明创建的是行级触发器
BEGIN
 --将修改前数据插入到日志记录表 del_emp ,以供监督使用。
 INSERT INTO operationlog (deptno , empno, ename , job ,mgr , sal , comm , hiredate )
 VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;

2.2 限制对表的操作

限制对user表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改user表。

CREATE OR REPLACE TRIGGER tr_user
BEFORE INSERT OR DELETE OR UPDATE
ON user
BEGIN
 IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
 RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改user表');
 END IF;
END;

只能对部门id为10的人员进行操作

CREATE OR REPLACE TRIGGER tr_user
BEFORE UPDATE OF salary, commission_pct
 OR DELETE
ON user
FOR EACH ROW
WHEN (old.department_id = 10)
BEGIN
 CASE
 WHEN UPDATING ('salary') THEN
 IF :NEW.salary < :old.salary THEN
  RAISE_APPLICATION_ERROR(-503, '部门10的人员的工资不能降');
 END IF;
 WHEN UPDATING ('jiangjin') THEN
 IF :NEW.jiangjin < :old.jiangjin THEN
  RAISE_APPLICATION_ERROR(-500, '部门10的人员的奖金不能降');
 END IF;
 WHEN DELETING THEN
  RAISE_APPLICATION_ERROR(-502, '不能删除部门10的信息');
 END CASE;
END;

2.3 数据审计

如果user表的age大于某个数值就往告警表插入一条数据

CREATE 
  OR REPLACE TRIGGER tr_user after UPDATE ON user FOR each ROW
  DECLARE-- local variables here
BEGIN
  IF
    : new.age > 20 THEN
      INSERT INTO warnlog
    VALUES
      ( : new.sal || '-' || : new.username || '-' || : new.job );
  END IF;
END tr_user;

二、webservice

axis和cxf方式最主要会有一个XmlSchema的jar包冲突,解决这个冲突的办法也很简单就是使用xmlshema-core.jar替换这个jar包。但是要注意版本,我是升级了个版本才有效的。

中间经历了很多的报错


Exception in thread "main" java.lang.NoSuchFieldError: QUALIFIED


java.lang.IllegalStateException: Unable to create endpoint: null


最终整合下来的jar包如下


20200805154415294.png

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
public class Test {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    final String address = "http://127.0.0.1:8001/netgate-server/webservice/api?wsdl";
    JaxWsDynamicClientFactory dcflient=JaxWsDynamicClientFactory.newInstance();
        Client client=dcflient.createClient(address);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        http.getClient().setReceiveTimeout(0);
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(180*1000);// 连接超时(毫秒)
        httpClientPolicy.setAllowChunking(false);// 取消块编码
        httpClientPolicy.setReceiveTimeout(300*1000);// 响应超时(毫秒)
        http.setClient(httpClientPolicy);
        try {
          Object[] objectall=client.invoke("Bind","Root","Admin","123","aaaaaaaaaaaa","","");
          System.out.println("*******"+objectall[0].toString());
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
}

源代码资源https://download.csdn.net/download/qq_35921773/12689366

目录
相关文章
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
存储 Oracle 关系型数据库
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】通过触发器复制varchar(4000 char)列的数据导致乱码
【YashanDB知识库】通过触发器复制varchar(4000 char)列的数据导致乱码
【YashanDB 知识库】通过触发器复制 varchar(4000 char) 列的数据导致乱码
**简介:** 某客户在使用触发器将表 A 的 varchar(4000 char) 列数据复制到表 B 时,出现数据乱码且不一致的问题。经分析,YashanDB 在处理触发器场景下的 varchar(4000 char) 列数据复制时存在机制错误,影响所有版本。建议将列长度修改为 varchar(2000 char) 或更小以规避问题。通过特定 SQL 可验证该问题是否存在。
|
Oracle 关系型数据库
Oracle触发器(主键自增脚本)
Oracle触发器(主键自增脚本)
222 0
Oracle触发器(主键自增脚本)
|
11月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
884 93

推荐镜像

更多