@TOC
仅解析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;
Q.E.D.