Oracle通过存储过程解析CLOB中的XML

仅解析XML中某个标签中的值

-- Created on 2020-12-23 by 20161 
declare 
  -- Local variables here
     --创建xml解析器实例xmlparser.Parser
   xmlPar        xmlparser.Parser := xmlparser.newParser;   
   --定义DOM文档
   xDoc          xmldom.DOMDocument;   
   --定义item子节点数目变量
   lenItem       INTEGER;   
   --定义节点列表,存放item节点们
   itemNodes     xmldom.DOMNodeList;   
   --定义节点,存放单个item节点
   itemNode      xmldom.DOMNode;   
   --XML字符串
   v_str varchar(1000);   
   ValueReturn   VARCHAR2 (100);
begin
  -- Test statements here
  SELECT MBOUTMSGS_CLOB_MSG into v_str FROM HIS.MBOUTMSGS where ID = 566773730;
  --解析xmlStr中xml字符串,并存放到xmlPar中
   xmlparser.parseClob (xmlPar, v_str); 
   --将xmlPar中的数据转存到dom文档中
   xDoc := xmlparser.getDocument (xmlPar);   
   --释放解析器实例
   xmlparser.freeParser (xmlPar);
   --获取所有item节点
   itemNodes := xmldom.getElementsByTagName (xDoc, 'META');
   --获取节点列表中的第1个item节点
   itemNode := xmldom.item (itemNodes, 0);
   --获取所有子节点的值
   ValueReturn := xmldom.getNodeValue (xmldom.getFirstChild (itemNode));   
   --释放dom
   xmldom.freeDocument(xDoc);   
   DBMS_OUTPUT.put_line('META' || ':' || ValueReturn);
end;

解析XML并将值插入表中

格式化日期

CREATE OR REPLACE FUNCTION FormatDateValue (key VARCHAR2, value VARCHAR2)
   RETURN VARCHAR2
IS
   --定义几个变量,出来解析过来的时间字符串
   --日月年时分(11OCT141024)
   Str      VARCHAR2(32);
   
   AA       VARCHAR2(32);
 
   DAY      VARCHAR2(32);
 
   MOUNTH   VARCHAR2(32);
 
   YEAR     VARCHAR2(32);
 
   HOUR     VARCHAR2(32);
 
   MINUTE   VARCHAR2(32);
 
   ValueReturn   VARCHAR2 (64);
 
BEGIN
 
   IF key != ' ' THEN
 
   DAY := SUBSTR(key,0,2);
   
   MOUNTH := SUBSTR(key,3,3);
   
   IF INSTR (MOUNTH,'JAN') > 0 THEN
   MOUNTH := 01;
   END IF;
   
   IF INSTR (MOUNTH,'FEB') > 0 THEN
   MOUNTH := 02;
   END IF;
   
   IF INSTR (MOUNTH,'MAR') > 0 THEN
   MOUNTH := 03;
   END IF;
   
   IF INSTR (MOUNTH,'APR') > 0 THEN
   MOUNTH := 04;
   END IF;
   
   IF INSTR (MOUNTH,'MAY') > 0 THEN
   MOUNTH := 05;
   END IF;
   
   IF INSTR (MOUNTH,'JUN') > 0 THEN
   MOUNTH := 06;
   END IF;
   
   IF INSTR (MOUNTH,'JUL') > 0 THEN
   MOUNTH := 07;
   END IF;
   
   IF INSTR (MOUNTH,'AUG') > 0 THEN
   MOUNTH := 08;
   END IF;
   
   IF INSTR (MOUNTH,'SEP') > 0 THEN
   MOUNTH := 09;
   END IF;
   
   IF INSTR (MOUNTH,'OCT') > 0 THEN
   MOUNTH := 10;
   END IF;
   
   IF INSTR (MOUNTH,'NOV') > 0 THEN
   MOUNTH := 11;
   END IF;
   
   IF INSTR (MOUNTH,'DEC') > 0 THEN
   MOUNTH := 12;
   END IF;
   
   YEAR := SUBSTR(key,6,2);
   
   HOUR := SUBSTR(key,8,2);
   
   MINUTE := SUBSTR(key,-2);
   
   AA := 20;
   
   Str := 0;
 
   --日月年时分(11OCT141017)
   IF length(MOUNTH) < 2 THEN
   
   MOUNTH := Str||MOUNTH;
   
   ValueReturn := AA || YEAR || '-' || MOUNTH || '-' || DAY || ' ' || HOUR || ':' || MINUTE;
   
   ELSE
   
   ValueReturn := AA || YEAR || '-' || MOUNTH || '-' || DAY || ' ' || HOUR || ':' || MINUTE;
   
   END IF;
   
   --ValueReturn := HOUR || ':' || MINUTE;
 
   RETURN ValueReturn;
 
   ELSE
   
   ValueReturn := ' ';
 
   RETURN ValueReturn;
 
   END IF;
 
END FormatDateValue;

解析XML取标签值

CREATE OR REPLACE FUNCTION GetXmlNodeValue_KC (xmlStr CLOB, nodeName VARCHAR2)
   RETURN VARCHAR2
IS
   --创建xml解析器实例xmlparser.Parser
   xmlPar        xmlparser.Parser := xmlparser.newParser;
   
   --定义DOM文档
   xDoc          xmldom.DOMDocument;
   
   --定义item子节点数目变量
   lenItem       INTEGER;
   
   --定义节点列表,存放item节点们
   itemNodes     xmldom.DOMNodeList;
   
   --定义节点,存放单个item节点
   itemNode      xmldom.DOMNode;
   
   ValueReturn   VARCHAR2 (100);
   
   
   
BEGIN
    
   --解析xmlStr中xml字符串,并存放到xmlPar中
   xmlparser.parseClob (xmlPar, xmlStr);
 
   --将xmlPar中的数据转存到dom文档中
   xDoc := xmlparser.getDocument (xmlPar);
   
   --释放解析器实例
   xmlparser.freeParser (xmlPar);
 
   --获取所有item节点
   itemNodes := xmldom.getElementsByTagName (xDoc, nodeName);
   
   --获取item节点的个数
   lenItem := xmldom.getLength (itemNodes);
    
  --如果无该标签,则返回EMPTY
   IF lenItem = 0 THEN
   
   ValueReturn := ' ';
  
   ELSE
   
   --获取节点列表中的第1个item节点
   itemNode := xmldom.item (itemNodes, 0);
 
   --获取所有子节点的值
   ValueReturn := xmldom.getNodeValue (xmldom.getFirstChild (itemNode));
   
   END IF;   
   
   --释放dom
   xmldom.freeDocument(xDoc);
   
   RETURN ValueReturn;
   
END GetXmlNodeValue_KC;

存储过程实现插入

CREATE OR REPLACE PROCEDURE TEST_PARSE_KC(xmlStr IN CLOB) IS
  SNDR VARCHAR2(100);
  DTTM VARCHAR2(100);
  TYPE VARCHAR2(100);
  STYP VARCHAR2(100);
  FFID VARCHAR2(100);
  FBAG VARCHAR2(100);
  LBAG VARCHAR2(100);

BEGIN

  SNDR := GetXmlNodeValue_KC(xmlStr, 'SNDR');
  DTTM := GetXmlNodeValue_KC(xmlStr, 'DTTM');
  TYPE := GetXmlNodeValue_KC(xmlStr, 'TYPE');
  STYP := GetXmlNodeValue_KC(xmlStr, 'STYP');
  FFID := GetXmlNodeValue_KC(xmlStr, 'FFID');
  FBAG := GetXmlNodeValue_KC(xmlStr, 'FBAG');
  LBAG := GetXmlNodeValue_KC(xmlStr, 'LBAG');

  --时间字段的时间格式函数的用法
  --DTTM := FORMATDATEVALUE (DTTM, 'DTTM');
  insert into ods.TEST_PARSER(SNDR,DTTM,TYPE,STYP,FFID,FBAG,LBAG)
  values(SNDR,DTTM,TYPE,STYP,FFID,FBAG,LBAG)
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END TEST_PARSE_KC;

执行

DECLARE
   --定义游标
   CURSOR c_cursor
   IS
      --这里查询指定时间内的数据,根据时间判断一下id>那个编号开始
SELECT MBOUTMSGS_CLOB_MSG FROM HIS.MBOUTMSGS;

v_MBOUTMSGS_CLOB_MSG HIS.MBOUTMSGS.MBOUTMSGS_CLOB_MSG%TYPE;
BEGIN
  --打开游标
  OPEN c_cursor;

  --提取游标数据
  FETCH c_cursor
    INTO v_MBOUTMSGS_CLOB_MSG;

  WHILE c_cursor%FOUND LOOP
    DBMS_OUTPUT.put_line(v_MBOUTMSGS_CLOB_MSG);
  
    FETCH c_cursor
      INTO v_MBOUTMSGS_CLOB_MSG;
  
    TEST_PARSE(v_MBOUTMSGS_CLOB_MSG);
  END LOOP;
END;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值