背景

在oracle中,存储过程不能很好的完成一个业务,所以还是需要通过java程序去完一个个业务,因为oracle的特性,所以我们必须打通与java程序的通讯问题,在此记录打通的流程。

oracle创建ACL

  1. 把下面程序放到oracle的查询控制台并修改一些数据后执行(放入后可能参数名爆红 不用在意,修改相应参数直接执行即可)

    -- 添加acl和权限控制(sql语句执行的方式来执行)
    begindbms_network_acl_admin.create_acl (       -- 创建访问控制文件(ACL)acl         => 'acl_name.xml',          -- 文件名称description => 'HTTP Access',           -- 描述principal   => 'N2ADMIN',             -- 授权或者取消授权账号,大小写敏感is_grant    => TRUE,                    -- 授权还是取消授权privilege   => 'connect',               -- 授权或者取消授权的权限列表start_date  => null,                    -- 起始日期end_date    => null                     -- 结束日期);dbms_network_acl_admin.add_privilege (    -- 添加访问权限列表项acl        => 'acl_name.xml',           -- 刚才创建的acl名称 principal  => 'N2ADMIN',                    -- 授权或取消授权用户is_grant   => TRUE,                     -- 与上同 privilege  => 'resolve',                -- 权限列表start_date => null,end_date   => null);dbms_network_acl_admin.assign_acl (       -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。acl        => 'acl_name.xml',host       => '192.0.0.100',           -- ip地址或者域名,填写https://localhost:8080/hello与https://localhost:8080/是会报host无效的-- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题lower_port => 8080,                     -- 允许访问的起始端口号upper_port => Null                      -- 允许访问的截止端口号);commit;
    end;

    注:acl文件名任意,保持一致即可,principal,host,lower_port,upper_port参数保证正确即可。

    创建好即可测试。

测试案例

  1. 先写一个调用接口的公用存储过程

    create PROCEDURE P_MES_POST(M_JSON     IN VARCHAR2, --请求报文JSON格式M_URL      IN VARCHAR2, --请求接口地址M_RESPONSE OUT VARCHAR2, --返回报文JSON格式RES        OUT VARCHAR2 --返回值) ASREQ    utl_http.req;RESP   utl_http.resp;V_LINE varchar2(4000);
    BEGINRES := 'OK:';IF M_JSON IS NULL THENRES := 'NG:' || '请求报文为空';RETURN;END IF;IF M_URL IS NULL THENRES := 'NG:' || '请求接口地址为空';RETURN;END IF;REQ := utl_http.begin_request(M_URL, 'POST');utl_http.set_body_charset('UTF-8');utl_http.set_header(REQ, 'Content-Type', 'application/json;charset=utf-8');utl_http.set_header(REQ, 'Content-Length', lengthb(M_JSON));utl_http.write_text(REQ, M_JSON);RESP :=utl_http.get_response(REQ) ;LOOPutl_http.read_line(RESP, V_LINE);M_RESPONSE := M_RESPONSE || V_LINE;--DBMS_OUTPUT.PUT_LINE('请求json ' || M_JSON);--DBMS_OUTPUT.PUT_LINE('返回json ' || M_RESPONSE);END LOOP;
    EXCEPTIONWHEN utl_http.end_of_body THENutl_http.end_response(RESP);WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(sqlerrm);utl_http.end_response(resp);utl_http.end_request(req);RES := 'NG:' || sqlerrm ;
    END;
    /
    
  2. 调用demo(该例子是PDA调用存储过程,存储过程调用java程序)

    create PROCEDURE "P_WH_FACTORY_ALLOT_UPDATE"(M_DOC IN VARCHAR2, --调拨单号M_HANDOVER_EMP IN VARCHAR2,--交接员工M_DOC_NUM IN VARCHAR2, --固定写法 界面上选择的单据号M_DATA_AUTH IN VARCHAR2, --固定写法 登录的组织机构M_WORKSTATION_SN IN VARCHAR2, --固定写法 当前工作中心SN法 默认输入值 用于显FLOWCODE OUT VARCHAR2, --固定写法 本存储过程执行之后流程跳转标识码RES OUT VARCHAR2 --固定写法) ASIN_FACTORY  VARCHAR2(20);--调入工厂OUT_FACTORY VARCHAR2(20);--调出工厂L_CODE      VARCHAR2(5); --codeL_MSG       VARCHAR2(1000); --messageL_URL       VARCHAR2(1000); --地址L_JSON      VARCHAR2(4000); -- 报文L_RES_JSON  VARCHAR2(1000); -- 结果IP          VARCHAR2(100);PORT        VARCHAR2(100);BEGINselect VALUE into IP from sy_dict_val t where dict_code = 'IP_PORT' and code = 'IP';select VALUE into PORT from sy_dict_val t where dict_code = 'IP_PORT' and code = 'PORT';L_JSON := '{' || '"M_DOC":"' || M_DOC || '","DATA_AUTH":"' ||M_DATA_AUTH || '","TYPE":"A001","OUT_FACTORY":"' || OUT_FACTORY || '","IN_FACTORY":"' || IN_FACTORY ||'"}';--传给后台的json数据L_URL := 'http://' || IP || ':' || PORT || '/mc/http/interface.ms?model=FactoryAllotAPI&method=FactoryAllotAPI';--urlp_mes_post(m_json => L_JSON,m_url => L_URL,m_response => L_RES_JSON,res => RES);--解析传出json    {"Code":"200","Message":"接收成功"} oracle 12cselect json_value(L_RES_JSON, '$.Code'),json_value(L_RES_JSON, '$.Message')into L_CODE, L_MSGfrom dual;IF NVL(SUBSTR(RES, 1, 2), 'null') <> 'OK' THENres := 'NG:' || '调接口出错' || L_MSG;RETURN;END IF;IF L_CODE = '0' THEN --接口返回code为0res := 'NG:' || L_MSG;--打印出后台返回的错误RETURN;elseRES := 'OK:' || '调用成功';END IF;EXCEPTIONWHEN OTHERS THENRES :='NG:出现了错误!'|| sqlerrm;-- DBMS_OUTPUT.PUT_LINE('出现了错误!'|| sqlerrm);
    END;
    /
  3. java后台(为了大家看的更清晰,我把具体业务删掉,只看返回方式即可),因为某些方法是我司自己封装的,后台仅供参考)

    package com.more.mes.warehouse;import com.more.fw.core.common.exception.AppException;
    import com.more.fw.core.common.method.CommMethod;
    import com.more.fw.core.common.method.SpringContextUtil;
    import com.more.fw.core.dbo.model.service.ModelService;
    import com.more.fw.http.service.HttpCoreService;
    import com.more.fw.http.service.IhttpServiceJosn;
    import com.more.fw.interf.InterfaceLog;import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.util.HashMap;
    import java.util.Map;/*** @author zhb* @data 2021年08月27日*/
    public class FactoryAllotAPI extends InterfaceLog implements IhttpServiceJosn {Map<String, Object> mapMessage = new HashMap<String, Object>();Map<String, Object> resultMap = new HashMap<String, Object>();@Overridepublic String exeFunc(HttpCoreService service) {//你的业务try {String statu = "SUCCESS";if ("SUCCESS".equals(statu)) {mapMessage.put("Code", "200");mapMessage.put("Message", "SAP Return Success:");resultMap.put("json", CommMethod.toJson(mapMessage));service.setResult(resultMap);service.getResponse().setHeader("Content-Type", "application/json");service.getResponse().setHeader("Access-Control-Allow-Origin", "*");service.getResponse().setHeader("Access-Control-Allow-Methods", "POST");service.getResponse().setHeader("Access-Control-Allow-Headers", "*");} else {mapMessage.put("Code", "0");mapMessage.put("Message", "你的错误信息");resultMap.put("json", CommMethod.toJson(mapMessage));service.setResult(resultMap);service.getResponse().setHeader("Content-Type", "application/json");service.getResponse().setHeader("Access-Control-Allow-Origin", "*");service.getResponse().setHeader("Access-Control-Allow-Methods", "POST");service.getResponse().setHeader("Access-Control-Allow-Headers", "*");}}catch (Exception e){ByteArrayOutputStream baos = new ByteArrayOutputStream();e.printStackTrace(new PrintStream(baos));mapMessage.put("Code", "0");mapMessage.put("Message", "APP ERROR:"+baos.toString());resultMap.put("json", CommMethod.toJson(mapMessage));service.setResult(resultMap);service.getResponse().setHeader("Content-Type", "application/json");service.getResponse().setHeader("Access-Control-Allow-Origin", "*");service.getResponse().setHeader("Access-Control-Allow-Methods", "POST");service.getResponse().setHeader("Access-Control-Allow-Headers", "*");}return null;}/*** @param service 请求包* @return String json字符串* @Description: 解析请求包* @Author: Bryan* @ChangeLog: 2021年08月27日  zhb 创建方法*/@SuppressWarnings({"unchecked", "rawtypes"})public static String getRequestJson(HttpCoreService service) {StringBuilder str = null;BufferedReader reader = null;try {reader = service.getHttpRequest().getReader();String line = null;str = new StringBuilder();while ((line = reader.readLine()) != null) {str.append(line);}} catch (Exception e) {throw new AppException(e);} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}return str.toString();}
    }

Oracle调用JAVA接口相关推荐

  1. java安全接口调用_步骤3:调用Java接口

    本文档主要介绍了通过调用Java接口生成工作密钥和进行通用数据加解密的操作方法. 整体流程 初始化SDK.具体内容请参见 配置Java接口.具体内容请参见 初始化SDK 使用以下方法初始化SDK.hs ...

  2. java. oracle 存储文件,oracle调用java类遍历磁盘文件

    利用oracle自带的utl_file包可以访问磁盘文件,但有个限制--无法访问文件夹?什么意思呢?就是说oracle只能访问指定的文件,而不能访问文件夹下的未知文件.所以,如果要通过oracle去遍 ...

  3. 在php中调用java接口吗,php 调用 java 接口

    php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...

  4. jni 调用java接口_JNI 调用 JAVA 接口

    JNI 调用 JAVA 接口 介绍 JNI 是本地语言编程接口.它允许运行在JVM中的Java代码和用C.C++或汇编写的本地代码相互操作. 由于一些加密等情况的需要,需要在 so 层获取一些信息用于 ...

  5. C#调用JAVA接口WSSE方式用WebClient方式

    C#读取JAVA的WSSE接口的调用代码: 用webclient 方式: /// <summary>/// 调用java cxf ws_security加密的服务wcf客户端对应的加密类/ ...

  6. C# 调用Java接口

    最近工作任务中包含了系统之间数据的互通,当然就考虑系统互相开通接口来实现通信了! 作为.NET的开发者,还没有调用过Java接口的经历,惭愧惭愧! 话不多说,直接进入正题! 调用webservice接 ...

  7. .svc接口客户端调用_K8s:调用Java接口创建容器

    Extract Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful), Kubernetes提供了 ...

  8. JAVA导入Oracle包_将java的jar包导入oracle,通过oracle调用java方法

    最近项目上遇到一个问题,因为项目一些数据设计保密的问题,所以数据库的很多数据都是脱敏存储的;但是需求又需要去模糊查询,这就蛋疼了, 由于项目是用base64脱敏的;第一次想到了把条件进行脱敏之后去数据 ...

  9. android调用java接口_java/Android 接口调用的几种写法

    虽然Handler用的地方比较普遍,但是接口也有他的独特之处,比较直观,然后降低了耦合性 如有一接口,需要将数据传给使用的activity中,接口如下 public interfacePushValu ...

最新文章

  1. cent os 6 fdisk fat32
  2. 热议!“建议放学时间与父母下班时间一致”,网友:陪我一起996吗?
  3. 织梦DEDE后台定时分时段自动更新发布文章插件
  4. Bootstrap+MetroNic_1.5.4 Head meta
  5. 日志规范之阿里巴巴开发手册中的其它规范讲解
  6. Java平台扩展机制#3:SLF4J怪招
  7. 前展(规划)后延(架设):编码开发程序员的出路之一
  8. 深度学习10-tf.data-数据输入管道简介
  9. 取值方法_函数的定义域和参数的取值范围详解
  10. vivo android8公测,vivo安卓9.0公测招募开启:明年年初获得推送
  11. Android使用exchange日历,使用Exchange服务实现跨平台(PC+Web + 移动端)日历的日程管理...
  12. 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo
  13. centos8安装python3.6_Centos下安装Python3.6
  14. Unity3D中引用Spine2D动画研究学习(一)
  15. 【杂谈】中国黑客致中国黑客和红客的公开信
  16. 飞鸽传书linux进程退出不彻底
  17. RIP---综合实验
  18. 知识点,声学传感器工作原理是这样
  19. ECMA5与ECMA6
  20. mysql 检索结果排序方式_mysql必知必会--排序检索数据

热门文章

  1. nodejs中Promise使用
  2. ShaderJoy —— 螺旋发光粒子【GLSL】
  3. postgresql 吕宏庆_吕宏庆:用网络汇聚爱心 用行动传递温情
  4. python读取excel中文_python如何读取excel
  5. 环形队列原理,全网最通俗易懂
  6. 我的世界java萌新须知_我的世界萌新游戏指南 萌新第一天都应该做什么?
  7. 【面经】2022互联网算法岗面试总结
  8. Unity5.x制作合金弹头(二)-主角的创建
  9. 设计模式 电子书 免费下载
  10. 经典设计案例:丢猫千万别找设计师