没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
22页
1.楼主所在公司有个业务需求是需要访问地方医保局发布的一个DRGs查询SOAP接口,POST入参,同时获取接口返回数据。 2.楼主搜了一些资料之后,自己研究用oracle里的UTL_HTTP包成功的访问到了接口,并获取了接口返回。 3.教程都整理成word,放在附件了。 文档包含一下四部分说明内容。 一、.使用utl_http包之前需要做以下数据库配置 二、创建解析接口响应xml格式文件的管道函数 三、创建访问soap/http接口,并解析xml的存储过程 四、响应报文用例,可用于调试管道函数
资源推荐
资源详情
资源评论
oracle 利用 UTL_HTTP 包访问 SOAP、HTTP 接口
使用 utl_http 包之前需要做以下数据库配置
1. 创建 ACL,如果原来数据库就已经创建了 ACL 文件,可以直接略过这一步,如果没有则
脚本如下。
begin
dbms_network_acl_admin.create_acl(
acl => 'utl_http.xml', -- 自定义文件名称
description => 'HTTP Access', -- 自定义描述
principal => 'xx', -- 要配置的数据库账号,大小
写敏感
is_grant => TRUE, -- 授权还是取消授权
privilege => 'connect', -- 连接权限
start_date => null, -- 起始日期,不维护则为不限
制,下同
end_date => null -- 结束日期
);
end;
2. 然后再在这个 acl 中给这个用户增加一个 resolve 的权限。
begin
dbms_network_acl_admin.add_privilege( acl => 'utl_http.xml', -- 刚才创建的 acl 名
称
principal => 'xx', -- 与上同
is_grant => TRUE, -- 与上同
privilege => 'resolve', -- resolve 权限
start_date => null,
end_date => null);
end;
3. 最后在 acl 中添加要访问的目标网址(ip 和域名均可),可以指定端口范围。
begin
dbms_network_acl_admin.assign_acl( -- 该段命令意思是允许访问 acl 名为 utl_http.xml 下授
权的用户,使用 oracle 网络访问包,所允许访问的目的主机,及其端口范围。
acl => 'utl_http.xml',
host => '192.168.xxx.xxx', -- ip 地址或者域名,填
写 https://localhost:9000/hello 与 https://localhost:9000/是会报 host 无效的,且建议使用 ip
地址或者使用域名,若用 localhost,当 oracle 不是安装在本机上的情况下,会出现问题
lower_port => '10344', -- 允许访问的起始端口号
upper_port => '10344' -- 允许访问的截止端口号
);
commit;
end;
创建解析接口响应 xml 格式文件的管道函数
1. 自定义表类型
因为需要以表的方式来输出解析 xml 响应文件,所以函数需要使用管道函数,不清楚什
么是管道函数的可以百度下,所以创建管道函数之前需要创建表类型 drg_table 作为管道
函数的返回值类型。
创建函数脚本如下
create or replace type drg_table is table of drg_data_type
2. 自定义表类型字段
定义 drg_table 表类型中所含的字段,这里根据要解析的 xml 响应文件,也就是接口里
的返回报文里面各个 xml 节点值对应得定义成表类型的字段。
创建 drg_table 表类型里所包含的字段脚本如下
create or replace type drg_data_type as object
(grp_time date,--
分组时间
grp_ver varchar2(100),--
分组版本
adrg_name varchar2(400),--ADRG
名称
grp_name varchar2(400),--
分组名称
mdc_codg varchar2(100),--MDC
编码
grp_spec_ver varchar2(100),--
分组规范版本号
ccmcc varchar2(400),--
合并症并发症
grp_rslt varchar2(12),--
分组成功标志
fixmedins_code varchar2(100),--
定点医药机构编号
mdc_name varchar2(500),--MDC
名称
psn_no varchar2(50),--
人员编号
place_grp_pay_std number(16,2),--
地方分组支付标准
err_info varchar2(1000),--
错误信息
place_drg_codg varchar2(100),--
地方
DRG
编码
abbr varchar2(500),--
简称
drg_name varchar2(500),--DRG
名称
place_grp_spec_ver varchar2(12),--
地方分组规范版本号
adrg_codg varchar2(100),--ADRG
编码
setl_id varchar2(100),--
结算
ID
drg_admdvs varchar2(12),--DRG
医保区划
setl_list_sn varchar2(200),--
结算清单流水号
place_drg_name varchar2(400),--
地方
DRG
名称
setl_ym varchar2(12),--
结算年月
place_grp_ver varchar2(100),--
地方分组版本
vali_flag varchar2(40),--
有效标志
drg_code varchar2(100),--DRG
编码
grp_type varchar2(12)--
分组类别
)
3. 创建管道函数
创建函数,解析 xml 响应文件脚本如下
/****************创建函数代码****************/
function of_get_drgval (as_clob_string in clob,as_clob_mark in varchar2)
return drg_table pipelined—利用管道函数来存储xml解析出来的节点值
as
vs_drg_table drg_data_type;
vs_bmark VARCHAR2(1000);
vs_emark VARCHAR2(1000);
vi_bpos integer;
vi_epos integer;
vs_clob_subr clob;--响应文件入参,clob类型支持超过32767长度的大文本
vs_grp_time_str varchar2(50);
vs_grp_time date;--
分组时间
vs_grp_ver varchar2(50);--
分组版本
vs_adrg_name varchar2(100);--ADRG
名称
vs_grp_name varchar2(200);--
分组名称
vs_mdc_codg varchar2(40);--MDC
编码
vs_grp_spec_ver varchar2(50);--
分组规范版本号
vs_ccmcc varchar2(200);--
合并症并发症
vs_grp_rslt varchar2(6);--
分组成功标志
vs_fixmedins_code varchar2(50);--
定点医药机构编号
vs_mdc_name varchar2(100);--MDC
名称
vs_psn_no varchar2(30);--
人员编号
vs_place_grp_pay_std number(16,2);--
地方分组支付标准
vs_err_info varchar2(500);--
错误信息
vs_place_drg_codg varchar2(50);--
地方
DRG
编码
vs_abbr varchar2(50);--
简称
vs_drg_name varchar2(100);--DRG
名称
vs_place_grp_spec_ver varchar2(6);--
地方分组规范版本号
vs_adrg_codg varchar2(50);--ADRG
编码
vs_setl_id varchar2(50);--
结算
ID
vs_drg_admdvs varchar2(6);--DRG
医保区划
vs_setl_list_sn varchar2(50);--
结算清单流水号
vs_place_drg_name varchar2(100);--
地方
DRG
名称
vs_setl_ym varchar2(6);--
结算年月
vs_place_grp_ver varchar2(50);--
地方分组版本
vs_vali_flag varchar2(20);--
有效标志
vs_drg_code varchar2(50);--DRG
编码
vs_grp_type varchar2(6);--
分组类别
begin
vs_bmark := '<' || lower(as_clob_mark) || '>';--截取段开始标记前缀,xml
格式文本一般每个节点的标记是以< 和/>括起来的内容。
vs_emark := '</' || lower(as_clob_mark) || '>'; --截取段结束标记前缀
vi_bpos:=dbms_lob.instr(dbms_lob.substr(as_clob_string,5000),vs_bmark)
;-- 截取开始节点标记位置
vi_epos:=dbms_lob.instr(dbms_lob.substr(as_clob_string,5000),vs_emark)
;--截取结束节点标记位置
/**因为xml文件长度超过32767,所以需要一段一段截取出来,这里以5000长度为一次截取长
度循环截取出来,然后循环提取节点值**/
while
dbms_lob.instr(dbms_lob.substr(as_clob_string,5000,vi_bpos),vs_emark)>
0 loop
vi_epos:=dbms_lob.instr(dbms_lob.substr(as_clob_string,5000,vi_bpos),
vs_emark);
vs_clob_subr:=dbms_lob.substr(dbms_lob.substr(as_clob_string,5000,vi_
bpos),vi_epos+LENGTH(vs_bmark));
vi_bpos:=vi_bpos+DBMS_LOB.GETLENGTH(vs_clob_subr);
/** xmltable 函数逐个解析xml里的节点出来,注意路径,这里举例的路径是//data**/
select x.* into vs_grp_time_str, vs_grp_ver, vs_adrg_name, vs_grp_name,
vs_mdc_codg, vs_grp_spec_ver, vs_ccmcc, vs_grp_rslt, vs_fixmedins_code,
vs_mdc_name, vs_psn_no, vs_place_grp_pay_std, vs_err_info,
vs_place_drg_codg, vs_abbr, vs_drg_name, vs_place_grp_spec_ver,
vs_adrg_codg, vs_setl_id, vs_drg_admdvs, vs_setl_list_sn,
vs_place_drg_name, vs_setl_ym, vs_place_grp_ver, vs_vali_flag,
vs_drg_code, vs_grp_type
from xmltable('//data' passing xmltype(vs_clob_subr)
columns
grp_time varchar2(50) path '//grp_time',
grp_ver varchar2(50) path '//grp_ver',
adrg_name varchar2(100) path '//adrg_name',
grp_name varchar2(200) path '//grp_name',
mdc_codg varchar2(40) path '//mdc_codg',
grp_spec_ver varchar2(50) path '//grp_spec_ver',
ccmcc varchar2(200) path '//ccmcc',
grp_rslt varchar2(6) path '//grp_rslt',
fixmedins_code varchar2(50) path '//fixmedins_code',
mdc_name varchar2(100) path '//mdc_name',
psn_no varchar2(30) path '//psn_no',
place_grp_pay_std number(16,2) path
'//place_grp_pay_std',
err_info varchar2(500) path '//err_info',
place_drg_codg varchar2(50) path '//place_drg_codg',
abbr varchar2(50) path '//abbr',
drg_name varchar2(100) path '//drg_name',
place_grp_spec_ver varchar2(6) path
'//place_grp_spec_ver',
adrg_codg varchar2(50) path '//adrg_codg',
setl_id varchar2(50) path '//setl_id',
drg_admdvs varchar2(6) path '//drg_admdvs',
setl_list_sn varchar2(50) path '//setl_list_sn',
place_drg_name varchar2(100) path
'//place_drg_name',
setl_ym varchar2(6) path '//setl_ym',
place_grp_ver varchar2(50) path '//place_grp_ver',
vali_flag varchar2(20) path '//vali_flag',
drg_code varchar2(50) path '//drg_code',
grp_type varchar2(6) path '//grp_type') x;
vs_grp_time:=vs_grp_time_str/(1000*60*60*24)+TO_DATE('1970-01-01
08:00:00','yyyy-MM-dd hh24:mi:ss');
vs_drg_table :=drg_data_type(vs_grp_time, vs_grp_ver, vs_adrg_name,
vs_grp_name, vs_mdc_codg, vs_grp_spec_ver, vs_ccmcc, vs_grp_rslt,
vs_fixmedins_code, vs_mdc_name, vs_psn_no, vs_place_grp_pay_std,
vs_err_info, vs_place_drg_codg, vs_abbr, vs_drg_name,
vs_place_grp_spec_ver, vs_adrg_codg, vs_setl_id, vs_drg_admdvs,
vs_setl_list_sn, vs_place_drg_name, vs_setl_ym, vs_place_grp_ver,
vs_vali_flag, vs_drg_code, vs_grp_type);
pipe row(vs_drg_table);--pipe row将提取出来的节点值全部填充到表类型
vs_drg_table里的字段中,然后在存储过程中就可以用select a.* from
table(of_get_drgval(vs_clob, 'data')) a语法像访问一般的数据库表一样访问到函
数返回值。
end loop;
return;
end of_get_drgval;
剩余21页未读,继续阅读
资源评论
q3217268
- 粉丝: 60
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功