摘要:最近项目中用到了存储过程,触发器,Function,由于以前没怎么用过,所以查资料,请教同事,最后总算是把问题解决了,问题是这样的,数据库中有三张表一张是存放从远程服务器获取数据的MBINMSGS表,这个表里面有个Clob字段,里面存放的是xml格式的字符串,我们要把这个表里面的xml字符串通过Oracle解析出来,然后再把解析出来的数据插入对应的数据表:TB_CMS_FLGTINFO_A表和TB_CMS_FLGTINFO_D表,以上就是问题的描述,下面我把我的代码贴出了,以供大家参考:
一:数据表结构SQL
CREATE TABLE MIP.MBINMSGS
(
ID NUMBER(30) NOT NULL,
MBINMSGS_CLOB_MSG CLOB,
MBINMSGS_DATE_RECEIVED DATE,
MBINMSGS_DATE_PROCESSED DATE,
MBINMSGS_SUBSYSTEM_NAME VARCHAR2(100 BYTE),
MBINMSGS_SUBSYSTEM_DATE_SENT DATE,
SERVICENAME VARCHAR2(30 BYTE) NOT NULL
)
CREATE TABLE MIP.TB_CMS_FLGTINFO_A
(
ID NUMBER(10) NOT NULL,
ABNS VARCHAR2(64 BYTE),
ACFT VARCHAR2(64 BYTE),
AIRLINE VARCHAR2(64 BYTE),
ALAP VARCHAR2(64 BYTE),
BETM VARCHAR2(64 BYTE),
CHDT VARCHAR2(64 BYTE),
EIBT VARCHAR2(64 BYTE),
FATA VARCHAR2(64 BYTE),
FETA VARCHAR2(64 BYTE),
FFID VARCHAR2(64 BYTE),
FSTA VARCHAR2(64 BYTE),
LMDT VARCHAR2(64 BYTE),
LMUR VARCHAR2(64 BYTE),
PSTM VARCHAR2(64 BYTE),
RENO VARCHAR2(64 BYTE),
RWAY VARCHAR2(64 BYTE),
SPOT VARCHAR2(64 BYTE),
STND VARCHAR2(64 BYTE)
)
CREATE TABLE MIP.TB_CMS_FLGTINFO_D
(
ID NUMBER(10) NOT NULL,
A_TOBT VARCHAR2(64 BYTE),
A_WEATHER VARCHAR2(64 BYTE),
ABNS VARCHAR2(64 BYTE),
ACFT VARCHAR2(64 BYTE),
AIRLINE VARCHAR2(64 BYTE),
ASAT VARCHAR2(64 BYTE),
BCTM VARCHAR2(64 BYTE),
BOTM VARCHAR2(64 BYTE),
BSTM VARCHAR2(64 BYTE),
C_TOBT VARCHAR2(64 BYTE),
COBT VARCHAR2(64 BYTE),
CTOT VARCHAR2(64 BYTE),
DINT VARCHAR2(64 BYTE),
DLAB VARCHAR2(64 BYTE),
DNAP VARCHAR2(64 BYTE),
DOUT VARCHAR2(64 BYTE),
EDDI VARCHAR2(64 BYTE),
EOBT VARCHAR2(64 BYTE),
EPGT VARCHAR2(64 BYTE),
EPOT VARCHAR2(64 BYTE),
FATD VARCHAR2(64 BYTE),
FFID VARCHAR2(64 BYTE),
FSTD VARCHAR2(64 BYTE),
LMDT VARCHAR2(64 BYTE),
LMUR VARCHAR2(64 BYTE),
OFTM VARCHAR2(64 BYTE),
RENO VARCHAR2(64 BYTE),
RWAY VARCHAR2(64 BYTE),
STDI VARCHAR2(64 BYTE),
STND VARCHAR2(64 BYTE),
TSAT VARCHAR2(64 BYTE)
)
二:Function.SQL
CREATE OR REPLACE FUNCTION MIP.GetXmlNodeValue (xmlStr CLOB, nodeName VARCHAR2)
RETURN VARCHAR2
IS
--创建xml解析器实例xmlparser.Parser
xmlPar xmlparser.Parser := xmlparser.newParser;
--定义DOM文档
xDoc xmldom.DOMDocument;
--定义item子节点数目变量
lenItme 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节点的个数
lenItme := xmldom.getLength (itemNodes);
IF lenItme = 0
THEN
RETURN '';
END IF;
--获取节点列表中的第1个item节点
itemNode := xmldom.item (itemNodes, 0);
--获取所有子节点的值
ValueReturn := xmldom.getNodeValue (xmldom.getFirstChild (itemNode));
RETURN ValueReturn;
END GetXmlNodeValue;
/
三:存储过程.SQL
CREATE OR REPLACE PROCEDURE MIP.MIP_PARSE (xmlStr IN CLOB)
IS
RENO VARCHAR2 (100);
AIRLINE VARCHAR2 (100);
FFID VARCHAR2 (100);
FFID_A VARCHAR2 (100);
FFID_D VARCHAR2 (100);
ABNS VARCHAR2 (100);
ACFT VARCHAR2 (100);
CHDT VARCHAR2 (100);
EIBT VARCHAR2 (100);
FATA VARCHAR2 (100);
FETA VARCHAR2 (100);
--FFID VARCHAR2 (100);
FSTA VARCHAR2 (100);
LMDT VARCHAR2 (100);
LMUR VARCHAR2 (100);
PSTM VARCHAR2 (100);
RWAY VARCHAR2 (100);
SPOT VARCHAR2 (100);
STND VARCHAR2 (100);
A_TOBT VARCHAR2 (100);
A_WEATHER VARCHAR2 (100);
--ABNS VARCHAR2 (100);
--ACFT VARCHAR2 (100);
ASAT VARCHAR2 (100);
BCTM VARCHAR2 (100);
BOTM VARCHAR2 (100);
BSTM VARCHAR2 (100);
C_TOBT VARCHAR2 (100);
COBT VARCHAR2 (100);
CTOT VARCHAR2 (100);
DINT VARCHAR2 (100);
DLAB VARCHAR2 (100);
DOUT VARCHAR2 (100);
EDDI VARCHAR2 (100);
EOBT VARCHAR2 (100);
EPGT VARCHAR2 (100);
EPOT VARCHAR2 (100);
FATD VARCHAR2 (100);
--FFID VARCHAR2 (100);
FSTD VARCHAR2 (100);
--LMDT VARCHAR2 (100);
--LMUR VARCHAR2 (100);
OFTM VARCHAR2 (100);
--RENO VARCHAR2 (100);
--RWAY VARCHAR2 (100);
STDI VARCHAR2 (100);
--STND VARCHAR2 (100);
TSAT VARCHAR2 (100);
BEGIN
RENO := GetXmlNodeValue (xmlStr, 'RENO');
AIRLINE := GetXmlNodeValue (xmlStr, 'AIRLINE');
FFID := GetXmlNodeValue (xmlStr, 'FFID');
ABNS := GetXmlNodeValue (xmlStr, 'ABNS');
ACFT := GetXmlNodeValue (xmlStr, 'ACFT');
CHDT := GetXmlNodeValue (xmlStr, 'CHDT');
EIBT := GetXmlNodeValue (xmlStr, 'EIBT');
FATA := GetXmlNodeValue (xmlStr, 'FATA');
FETA := GetXmlNodeValue (xmlStr, 'FETA');
FFID := GetXmlNodeValue (xmlStr, 'FFID');
FSTA := GetXmlNodeValue (xmlStr, 'FSTA');
LMDT := GetXmlNodeValue (xmlStr, 'LMDT');
LMUR := GetXmlNodeValue (xmlStr, 'LMUR');
PSTM := GetXmlNodeValue (xmlStr, 'PSTM');
RWAY := GetXmlNodeValue (xmlStr, 'RWAY');
SPOT := GetXmlNodeValue (xmlStr, 'SPOT');
STND := GetXmlNodeValue (xmlStr, 'STND');
A_TOBT := GetXmlNodeValue (xmlStr, 'A_TOBT');
A_WEATHER := GetXmlNodeValue (xmlStr, 'A_WEATHER');
--ABNS := GetXmlNodeValue (xmlStr, 'ABNS');
--ACFT := GetXmlNodeValue (xmlStr, 'ACFT');
ASAT := GetXmlNodeValue (xmlStr, 'ASAT');
BCTM := GetXmlNodeValue (xmlStr, 'BCTM');
BOTM := GetXmlNodeValue (xmlStr, 'BOTM');
BSTM := GetXmlNodeValue (xmlStr, 'BSTM');
C_TOBT := GetXmlNodeValue (xmlStr, 'C_TOBT');
COBT := GetXmlNodeValue (xmlStr, 'COBT');
CTOT := GetXmlNodeValue (xmlStr, 'CTOT');
DINT := GetXmlNodeValue (xmlStr, 'DINT');
DLAB := GetXmlNodeValue (xmlStr, 'DLAB');
DOUT := GetXmlNodeValue (xmlStr, 'DOUT');
EDDI := GetXmlNodeValue (xmlStr, 'EDDI');
EOBT := GetXmlNodeValue (xmlStr, 'EOBT');
EPGT := GetXmlNodeValue (xmlStr, 'EPGT');
EPOT := GetXmlNodeValue (xmlStr, 'EPOT');
FATD := GetXmlNodeValue (xmlStr, 'FATD');
FSTD := GetXmlNodeValue (xmlStr, 'FSTD');
--LMDT := GetXmlNodeValue (xmlStr, 'LMDT');
--LMUR := GetXmlNodeValue (xmlStr, 'LMUR');
OFTM := GetXmlNodeValue (xmlStr, 'OFTM');
STDI := GetXmlNodeValue (xmlStr, 'STDI');
TSAT := GetXmlNodeValue (xmlStr, 'TSAT');
IF INSTR(FFID,'-D-') > 0 THEN
FFID_D := FFID;
INSERT INTO TB_CMS_FLGTINFO_D (ID,A_TOBT,A_WEATHER,ABNS,ACFT,AIRLINE,ASAT,BCTM,BOTM,BSTM,C_TOBT,COBT,CTOT,DINT,DLAB,DOUT,EDDI,EOBT,EPGT,EPOT,FATD,FFID,FSTD,LMDT,LMUR,OFTM,RENO,RWAY,STDI,STND,TSAT)
VALUES (FLGTINFO_D_SEQ.NEXTVAL,
A_TOBT,
A_WEATHER,
ABNS,
ACFT,
AIRLINE,
ASAT,
BCTM,
BOTM,
BSTM,
C_TOBT,
COBT,
CTOT,
DINT,
DLAB,
DOUT,
EDDI,
EOBT,
EPGT,
EPOT,
FATD,
FFID_D,
FSTD,
LMDT,
LMUR,
OFTM,
RENO,
RWAY,
STDI,
STND,
TSAT);
ELSE
FFID_A := FFID;
INSERT INTO TB_CMS_FLGTINFO_A (ID,ABNS,ACFT,AIRLINE,CHDT,FFID,RENO,EIBT,FATA,FETA,FSTA,LMDT,LMUR,PSTM,RWAY,SPOT,STND)
VALUES (FLGTINFO_A_SEQ.NEXTVAL,
ABNS,
ACFT,
AIRLINE,
CHDT,
FFID_A,
RENO,
EIBT,
FATA,
FETA,
FSTA,
LMDT,
LMUR,
PSTM,
RWAY,
SPOT,
STND);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END MIP_PARSE;
/
四:触发器.SQL
DROP TRIGGER MIP.COPY_MIPDATA_TRIGGER;
CREATE OR REPLACE TRIGGER MIP.COPY_MIPDATA_TRIGGER
AFTER INSERT
ON MIP.MBINMSGS FOR EACH ROW
DECLARE
-- LOCAL VARIABLES HERE
BEGIN
MIP_PARSE (:NEW.MBINMSGS_CLOB_MSG);
END COPY_MIPDATA_TRIGGER;
/
五:最后把所有的Function,存储过程,触发器都编译一下,就可以执行了,执行过程是:给表MBINMSGS中每插入一条数据,触发器就触发存储过程,存储过程再调用Function,最后把解析出来的xml字符串插入到对应的数据表中。
分享到:
相关推荐
ORACLE中CLOB字段转String类型
CLOB字段类型报错 ORA-01704:文字字符串过长的解决
大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,...
把oracle数据库中字段类型为clob的字段值以字符串的形式读取出来
JDBC读写Oracle的CLOB字段
当ORACLE需要存放一些不定长而长度又长于4000字符的字符串时,可考虑使用ORACLE的CLOB类型进行存储,此时就要将该字符串转化为CLOB类型。
运用Java如何存取Oracle中的CLOB类型字段
sql server中的image类型的数据导出到oracle的clob字段中
向Oracle数据库插入Clob大段文本解决方法
CLOB字段处理 对CLOB进行存取的例子
java读取oracle数据库中clob字段 把oracle数据库中字段类型为clob的字段值以字符串的形式读取出来
java调用oracle含有clob参数的存储过程
oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。
介绍了利用Hibernate将一个长字符串转换为流存储至Clob字段中,然后再从Clob字段中读出来,转换为字符串输出的方式
java操作oracle clob,基础教程,教你clob在java中的用法,简单易学。
NULL 博文链接:https://hackpro.iteye.com/blog/1845366
Mybatis 处理 CLOB、BLOB 类型数据
Oracle如何插入CLOB字段值,附件为简单的示例代码。Oracle如何插入CLOB字段值,附件为简单的示例代码。
Oracle导出Clob,Blob工具 ,支持导出CLob工具版本2,解决上个版本导出时间有问题的bug