oracle存储过程通过http接收xml文件并解析入库

该存储过程从HTTP请求接收XML文件,解析其中的stock元素,将板块名称和股票代码存储到Oracle数据库的tb_index_0292表中。过程中涉及到UTL_HTTP、DBMS_XMLPARSER和DBMS_XMLDOM等包的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--------------------------------------------配置----------------------------------------------------

--创建控制列表并赋权

BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'test_acl_file.xml',
description => 'this is a test',
principal => 'SCOTT',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);
COMMIT;
END;

--添加新用户
EGIN
DBMS_NETWORK_ACL_ADMIN.add_privilege (
acl => 'test_acl_file.xml',
principal => 'user_name',
is_grant => FALSE,
privilege => 'connect',
position => NULL,
start_date => NULL,
end_date => NULL);

COMMIT;
END;

--使用DROP_ACL删除访问控制列表

BEGIN
DBMS_NETWORK_ACL_ADMIN.drop_acl (
acl => 'test_acl_file.xml');
COMMIT;
END;

--给网络分配一个访问控制列表
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'test_acl_file.xml',
host => 'www.test.com',--特定ip
lower_port => 80,--指定端口
upper_port => NULL);

/*DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'test_acl_file.xml',
host => '10.1.10.*',--子网
lower_port => NULL,
upper_port => NULL);*/

COMMIT;
END;

--访问控制列表视图
select * from DBA_NETWORK_ACLS;
select * from DBA_NETWORK_ACL_PRIVILEGES;
select * from USER_NETWORK_ACL_PRIVILEGES;

SELECT *
FROM TABLE(DBMS_NETWORK_ACL_UTILITY.domains('www.chinastock.com.cn'));




--测试
DECLARE
l_url VARCHAR2(300) := 'http://www.test.com.cn/stock.xml';
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
BEGIN
-- Make a HTTP request and get the response.
l_http_request := UTL_HTTP.begin_request(l_url);
l_http_response := UTL_HTTP.get_response(l_http_request);
UTL_HTTP.end_response(l_http_response);

END;


-------------------------------------------------------------代码--------------------------------------------------------------

create or replace procedure proc_recive_xml (p_url  in  varchar2)
/***
 * function:通过http请求xml数据,解析接收的xml数据,并入库
 * author:
 * date:
 */
is
  l_http_request   utl_http.req;
  l_http_response  utl_http.resp;
  l_clob           clob;
  l_text           varchar2(32767);
  l_parser        dbms_xmlparser.parser;
  l_doc           dbms_xmldom.domdocument;
  l_nl            dbms_xmldom.domnodelist;
  l_n             dbms_xmldom.domnode;
  parent_rootnode dbms_xmldom.domnode;
  l_rootnode_name varchar2(200);
  l_name          varchar2(1000);
  l_code          varchar2(6);

  type v_index_stock is record (
    index_name varchar2(50),--板块名称
    stock_code varchar2(6)--股票代码
  );
  type v_arr_index_stock is table of v_index_stock index by binary_integer;
  arr_index_stock v_arr_index_stock;
begin
 
  /*使用clob接收http数据*/
  dbms_lob.createtemporary(l_clob, false);-- 初始化clob
  -- 发送http请求
  l_http_request  := utl_http.begin_request(p_url);
  utl_http.set_header(l_http_request, 'content-type', 'text/html; charset=utf8');
  l_http_response := utl_http.get_response(l_http_request);
  -- 存储接收的http数据到clob
  begin
    loop
      utl_http.read_text(l_http_response, l_text, 32767);
      dbms_lob.writeappend (l_clob, length(l_text), l_text);
    end loop;
  exception
    when utl_http.end_of_body then
      utl_http.end_response(l_http_response);
  end;
 
  /*使用dom解析xml*/
  l_parser := dbms_xmlparser.newparser;-- 创建解析器
  -- 解析并创建dom文档
  dbms_xmlparser.parseclob(l_parser, l_clob);
  l_doc := dbms_xmlparser.getdocument(l_parser);

  --取节点item下各元素的值,先将items节点全部存放在 l_nl中
  l_nl    := dbms_xmldom.getelementsbytagname(l_doc,'stock');
  for cur_emp in 0 .. dbms_xmldom.getlength(l_nl) - 1 loop
    l_n := dbms_xmldom.item(l_nl, cur_emp);
    -- 得到节点stock下元素的值
    l_code := xmldom.getattribute(xmldom.makeelement(l_n),'code');
    -- 得到节点stock的父节点bk
    parent_rootnode := dbms_xmldom.getparentnode(l_n);
    l_rootnode_name := xmldom.getnodename(parent_rootnode);
    -- 得到节点bk的属性name的值
    l_name    := xmldom.getattribute(xmldom.makeelement(parent_rootnode),'name');
    arr_index_stock(arr_index_stock.count + 1).index_name := l_name;
    arr_index_stock(arr_index_stock.count).stock_code := l_code;
  end loop;
 
  -- 释放分析函数的资源
  dbms_xmlparser.freeparser(l_parser);
  -- 将doc清空,释放资源
  dbms_xmldom.freedocument(l_doc);
  --清空数据
  delete from tb_index_0292;
  for idx in 1..arr_index_stock.count loop
   --dbms_output.put_line('name =' ||arr_stock_concept(idx).index_name || ' ,code = '||arr_stock_concept(idx).stock_code);
   insert into  tb_index_0292
   values(idx,arr_index_stock(idx).index_name,arr_index_stock(idx).stock_code,ob_seq_id.nextval);
  end loop;
  commit;

  --释放临时clob
  dbms_lob.freetemporary(l_clob);
exception
  when others then
    rollback;
    utl_http.end_response(l_http_response);
    dbms_lob.freetemporary(l_clob);
end;

-------------------------------------------------文件格式------------------------------------------------------------


<?xml version='1.0' encoding='UTF-8'?>
<root>
        <bk name="aa">
                <stock code="000001" />
                <stock code="000002"/>
                <stock code="000003"/>
        </bk>
        <bk name="bb">
              <stock code="000004" />
                <stock code="000005"/>
                <stock code="000006"/>
        </bk>
</root>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值