Oracle调用JAVA接口
背景
在oracle中,存储过程不能很好的完成一个业务,所以还是需要通过java程序去完一个个业务,因为oracle的特性,所以我们必须打通与java程序的通讯问题,在此记录打通的流程。
oracle创建ACL
把下面程序放到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参数保证正确即可。
创建好即可测试。
测试案例
先写一个调用接口的公用存储过程
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; /
调用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; /
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接口相关推荐
- java安全接口调用_步骤3:调用Java接口
本文档主要介绍了通过调用Java接口生成工作密钥和进行通用数据加解密的操作方法. 整体流程 初始化SDK.具体内容请参见 配置Java接口.具体内容请参见 初始化SDK 使用以下方法初始化SDK.hs ...
- java. oracle 存储文件,oracle调用java类遍历磁盘文件
利用oracle自带的utl_file包可以访问磁盘文件,但有个限制--无法访问文件夹?什么意思呢?就是说oracle只能访问指定的文件,而不能访问文件夹下的未知文件.所以,如果要通过oracle去遍 ...
- 在php中调用java接口吗,php 调用 java 接口
php 需要开启 curl模块 /* * HTTP 请求函数封装 */ function http_request_cloudzone($url, $data){ //var_dump($url.&q ...
- jni 调用java接口_JNI 调用 JAVA 接口
JNI 调用 JAVA 接口 介绍 JNI 是本地语言编程接口.它允许运行在JVM中的Java代码和用C.C++或汇编写的本地代码相互操作. 由于一些加密等情况的需要,需要在 so 层获取一些信息用于 ...
- C#调用JAVA接口WSSE方式用WebClient方式
C#读取JAVA的WSSE接口的调用代码: 用webclient 方式: /// <summary>/// 调用java cxf ws_security加密的服务wcf客户端对应的加密类/ ...
- C# 调用Java接口
最近工作任务中包含了系统之间数据的互通,当然就考虑系统互相开通接口来实现通信了! 作为.NET的开发者,还没有调用过Java接口的经历,惭愧惭愧! 话不多说,直接进入正题! 调用webservice接 ...
- .svc接口客户端调用_K8s:调用Java接口创建容器
Extract Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful), Kubernetes提供了 ...
- JAVA导入Oracle包_将java的jar包导入oracle,通过oracle调用java方法
最近项目上遇到一个问题,因为项目一些数据设计保密的问题,所以数据库的很多数据都是脱敏存储的;但是需求又需要去模糊查询,这就蛋疼了, 由于项目是用base64脱敏的;第一次想到了把条件进行脱敏之后去数据 ...
- android调用java接口_java/Android 接口调用的几种写法
虽然Handler用的地方比较普遍,但是接口也有他的独特之处,比较直观,然后降低了耦合性 如有一接口,需要将数据传给使用的activity中,接口如下 public interfacePushValu ...
最新文章
- cent os 6 fdisk fat32
- 热议!“建议放学时间与父母下班时间一致”,网友:陪我一起996吗?
- 织梦DEDE后台定时分时段自动更新发布文章插件
- Bootstrap+MetroNic_1.5.4 Head meta
- 日志规范之阿里巴巴开发手册中的其它规范讲解
- Java平台扩展机制#3:SLF4J怪招
- 前展(规划)后延(架设):编码开发程序员的出路之一
- 深度学习10-tf.data-数据输入管道简介
- 取值方法_函数的定义域和参数的取值范围详解
- vivo android8公测,vivo安卓9.0公测招募开启:明年年初获得推送
- Android使用exchange日历,使用Exchange服务实现跨平台(PC+Web + 移动端)日历的日程管理...
- 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo
- centos8安装python3.6_Centos下安装Python3.6
- Unity3D中引用Spine2D动画研究学习(一)
- 【杂谈】中国黑客致中国黑客和红客的公开信
- 飞鸽传书linux进程退出不彻底
- RIP---综合实验
- 知识点,声学传感器工作原理是这样
- ECMA5与ECMA6
- mysql 检索结果排序方式_mysql必知必会--排序检索数据