oracle怎么跑请求,oracle发送http请求。

本文介绍了如何在Oracle数据库中通过配置触发器和存储过程实现HTTP POST请求,特别关注了字符集问题、ACL权限设置以及网络访问的管理。作者详细阐述了处理乱码的方法和创建网络访问控制清单的过程。
摘要由CSDN通过智能技术生成

使用oracle发送http请求,实现的思路是:在某张表上配置触发器,该触发器调用存储过程,使用存储过程执行http请求的发送。

需要注意的几点是:

1、http post请求,在发送的时候,跟数据库的字符集有关,在处理不当的时候,会出现乱码问题。

2、oracle访问网络服务的时候,需要配置acl权限。

创建触发器:

CREATE OR REPLACE TRIGGER "T_POST4REQHAND" AFTER INSERT ON "REQUESTHANDLERINFO" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW

declare

begin

PRO_POSTREQ(:new.id,:new.params);

end T_POST4REQHAND;

创建存储过程:

create or replace procedure "PRO_POSTREQ"(r_id in varchar2,params in varchar2) as

begin

DECLARE

req UTL_HTTP.REQ;

resp UTL_HTTP.RESP;

value VARCHAR2(1024); -- URL to post to

v_url VARCHAR2(4000) := 'http://192.168.0.156:8080/bzjw_platform/f/responseresult/responseResult/invokeOutRequest?rid='||r_id||'&&params'||params;

v_param VARCHAR2(4000) := '1';

v_param_length NUMBER := LENGTHB(v_param);

BEGIN

DBMS_OUTPUT.ENABLE (buffer_size=>null);

req := UTL_HTTP.BEGIN_REQUEST (url=> v_url, method => 'POST');

UTL_HTTP.SET_BODY_CHARSET('UTF-8');

UTL_HTTP.SET_HEADER (r => req,

name => 'Content-Type',

value => 'application/x-www-form-urlencoded');

UTL_HTTP.SET_HEADER(req, 'Keep-Alive', ' timeout=1');

UTL_HTTP.SET_HEADER (r => req,

name => 'Content-Length',

value => v_param_length);

UTL_HTTP.WRITE_RAW (r => req,

data => UTL_RAW.CAST_TO_RAW(v_param));

resp := UTL_HTTP.GET_RESPONSE(req);

LOOP

UTL_HTTP.READ_LINE(resp, value, TRUE);

DBMS_OUTPUT.PUT_LINE(value);

END LOOP;

UTL_HTTP.END_RESPONSE(resp);

EXCEPTION

WHEN UTL_HTTP.END_OF_BODY THEN

UTL_HTTP.END_RESPONSE(resp);

END;

end PRO_POSTREQ;

该请求为post,但是所有的参数传递均放置在URL中,原因是,放置在v_param 这个参数中时,数据库字符集为utf8的时候,一切正常,但是若是gbk,则发生乱码。

原因是 oracle的参数拼接字符 “||”会进行一次编码。 按照网上所说的,使用转码等一系列操作,最终仍没有解决。

定义ACL,若没有ACL,则无法访问网络。

--定义ACL 取名:httprequestpermission.xml

BEGIN

dbms_network_acl_admin.create_acl(acl => 'httprequestpermission.xml',

DESCRIPTION => 'Normal Access',

principal => 'CONNECT',

is_grant => TRUE,

PRIVILEGE => 'connect',

start_date => NULL,

end_date => NULL);

END;

--查看ACL是否增加成功

SELECT any_path

FROM resource_view

where any_path like '/sys/acls/%.xml'

;

--给用户增加acl权限,这里是 SD_JY 注意是大写,小写不识别

begin dbms_network_acl_admin.add_privilege(acl => 'httprequestpermission.xml',

principal => 'SD_JY',

is_grant => TRUE,

privilege => 'connect',

start_date => null,

end_date => null);

end;

--添加对应主机 ,将对应主机和端口添加到ACL。这里是 192.168.0.156 和 8080 ,这个ip和端口要和上面存储过程中定义的地址一致

begin

dbms_network_acl_admin.assign_acl(acl => 'httprequestpermission.xml',

host => '192.168.0.156',

lower_port => 8080,

upper_port => NULL);

end;

ACL的增加过程为:建立新的acl文件,对该文件中,用户授权,对该文件中,URL和端口授权。

可查看对应的ACL信息是否添加上

SELECT acl,

principal,

privilege,

is_grant,

TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,

TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date

FROM dba_network_acl_privileges;

至此,访问存储过程或者触发器,测试对应的程序即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值