总觉得这种方式心里用着没谱,因为对他并不了解。比如是否涉及到资源释放啊,异常捕获啊,是否能稳定高并发运行啊。大家也可以看一下 帮我优化优化。
首先1·要使用
--开启Oracle ACL权限
/* --创建访问控制文件(ACL)
begin
dbms_network_acl_admin.create_acl ( -- 创建访问控制文件(ACL)
acl => 'utl_http.xml', -- 文件名称
description => 'HTTP Access', -- 描述
principal => 'username', -- 授权或者取消授权账号,大小写敏感
is_grant => TRUE, -- 授权还是取消授权
privilege => 'connect', -- 授权或者取消授权的权限列表
start_date => null, -- 起始日期
end_date => null -- 结束日期
);
--添加访问权限列表项
dbms_network_acl_admin.add_privilege ( -- 添加访问权限列表项
acl => 'utl_http.xml', -- 刚才创建的acl名称
principal => 'username', -- 授权或取消授权用户
is_grant => TRUE, -- 与上同
privilege => 'resolve', -- 权限列表
start_date => null,
end_date => null
);
--配置对应ip地址及端口
dbms_network_acl_admin.assign_acl ( -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
acl => 'utl_http.xml',
host => '127.0.0.1', -- ip地址或者域名,填写http://localhost:9000/hello与http://localhost:9000/是会报host无效的
-- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
lower_port => 8889, -- 允许访问的起始端口号
upper_port => Null -- 允许访问的截止端口号
);
commit;
end;
后期再添加 一些指定的host 和 端口 可以使用:
begin
dbms_network_acl_admin.assign_acl ( -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
acl => 'utl_http.xml',
host => '127.0.0.1', -- ip地址或者域名,错误示例:http://127.0.0.1:80
-- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
lower_port => 80, -- 允许访问的起始端口号
upper_port => Null -- 允许访问的截止端口号
);
commit;
end;
2·编写PROCEDURE
CREATE OR REPLACE PROCEDURE P_RECEIVE_HTTP
IS
V_RESULT VARCHAR2(50);--用于存储上行接口返回的数据
REQ UTL_HTTP.REQ;
RESP UTL_HTTP.RESP;
VALUE VARCHAR2(1000);
P_CONTENT VARCHAR2(1000);
V_URL VARCHAR2(200) := 'http://';
V_PARAM VARCHAR2(500);
CURSOR CUR IS SELECT * from RECEIVE WHERE RECEIVE_STATUS = 0 FOR UPDATE;
CUR_RECEIVE RECEIVE%ROWTYPE;
BEGIN
OPEN CUR;
LOOP
EXIT WHEN CUR%NOTFOUND;
fetch CUR into CUR_RECEIVE;
DBMS_OUTPUT.PUT_LINE(CUR_RECEIVE.Receive_Id);
V_PARAM := 'token=0eff44c362b13fa25fc88a412f5512e1='||CUR_RECEIVE.MOBILE_FROM||'='||UTL_URL.ESCAPE(CUR_RECEIVE.RECEIVE_MSG,FALSE,'UTF-8')||'='||TO_CHAR(CUR_RECEIVE.RECEIVE_TIME,'yyyy-MM-dd HH24:mi:ss');
req := UTL_HTTP.BEGIN_REQUEST (url=> v_url, method => 'POST');
UTL_HTTP.SET_HEADER (r => req, name => 'Content-Type',VALUE => 'application/x-www-form-urlencoded;charset=UTF-8');
UTL_HTTP.SET_HEADER (r => req,name => 'Content-Length',VALUE => LENGTH(V_PARAM));
UTL_HTTP.WRITE_TEXT (r => req,data => V_PARAM);
resp := UTL_HTTP.GET_RESPONSE(req);
UTL_HTTP.READ_LINE(resp, value, TRUE);
IF INSTR(VALUE,'"code":"0"')> 0 THEN
update RECEIVE set RECEIVE_STATUS = 1,REMARK = value where RECEIVE_ID = CUR_RECEIVE.RECEIVE_ID;
ELSE
update RECEIVE set RECEIVE_STATUS = 2,REMARK = value where RECEIVE_ID = CUR_RECEIVE.RECEIVE_ID;
END IF;
UTL_HTTP.END_RESPONSE(resp);
END LOOP;
CLOSE CUR;
END P_RECEIVE_HTTP;
3·编写 job定时任务
begin
dbms_scheduler.create_job (
job_name => 'JOB_CW_RECEIVE_HTTP', --job名
job_type => 'STORED_PROCEDURE',--job类型
job_action => 'P_RECEIVE_HTTP', --存储过程名
start_date => sysdate,--开始执行时间
repeat_interval => 'FREQ=MINUTELY; INTERVAL=5', -- 下次执行时间
comments => '每10分钟读取receive表数据 http推送到创维方',--注释
auto_drop=>false --job禁用后是否自动删除
);
end;
4·job相关操作
--查询
select * from dba_scheduler_jobs;
--运行
begin
dbms_scheduler.run_job('JOB_CW_RECEIVE_HTTP');
end;
--启用
begin
dbms_scheduler.enable('JOB_CW_RECEIVE_HTTP');
end;
--禁用
begin
dbms_scheduler.disable('JOB_CW_RECEIVE_HTTP');
end;
--刪除
begin
dbms_scheduler.drop_job(job_name => 'JOB_CW_RECEIVE_HTTP',force => TRUE);
end;