总觉得这种方式心里用着没谱,因为对他并不了解。比如是否涉及到资源释放啊,异常捕获啊,是否能稳定高并发运行啊。大家也可以看一下 帮我优化优化。
首先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',-- 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;