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

目录
相关文章
|
4天前
|
SQL 数据采集 Oracle
实时计算 Flink版产品使用问题之如何读取oracle中的blob类型的数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之在进行Oracle数据库的全量同步时,只同步了一条数据而源表实际上包含多条数据,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4天前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用问题之连接到Oracle数据库但无法读取到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4天前
|
资源调度 Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,任务不报错,但是读不到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
15天前
|
Oracle 关系型数据库 数据库
oracle误删除数据的恢复方法
oracle误删除数据的恢复方法
|
28天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之是否支持多并行度采集Oracle全量数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
28天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之从Oracle数据库同步数据时,checkpoint恢复后无法捕获到任务暂停期间的变更日志,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
负载均衡 Oracle 关系型数据库
使用触发器记录oracle用户登陆信息
      Oracle 提供了强大的审计功能,可以针对用户级,系统级范围,以及标准审计,细粒度审计等多种方式来审计各种数据库层面上的操作。然很多中小型数据库需要记录用户的登陆登出信息,而又不希望牺牲太多的性能。
1073 0
|
28天前
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
|
15天前
|
Oracle 关系型数据库 数据库
已解决:idea 连接 oracle 数据库 避雷
已解决:idea 连接 oracle 数据库 避雷

推荐镜像

更多