【Oracle】UTL_HTTP 发送http请求,定时任务job+存储过程PROCEDURE

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

首先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;



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值