Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段类型中存储的xml字符串...
摘要:最近項(xiàng)目中用到了存儲(chǔ)過程,觸發(fā)器,Function,由于以前沒怎么用過,所以查資料,請(qǐng)教同事,最后總算是把問題解決了,問題是這樣的,數(shù)據(jù)庫中有三張表一張是存放從遠(yuǎn)程服務(wù)器獲取數(shù)據(jù)的MBINMSGS表,這個(gè)表里面有個(gè)Clob字段,里面存放的是xml格式的字符串,我們要把這個(gè)表里面的xml字符串通過Oracle解析出來,然后再把解析出來的數(shù)據(jù)插入對(duì)應(yīng)的數(shù)據(jù)表:TB_CMS_FLGTINFO_A表和TB_CMS_FLGTINFO_D表,以上就是問題的描述,下面我把我的代碼貼出了,以供大家參考:
一:數(shù)據(jù)表結(jié)構(gòu)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--創(chuàng)建xml解析器實(shí)例xmlparser.ParserxmlPar xmlparser.Parser := xmlparser.newParser;--定義DOM文檔xDoc xmldom.DOMDocument;--定義item子節(jié)點(diǎn)數(shù)目變量lenItme INTEGER;--定義節(jié)點(diǎn)列表,存放item節(jié)點(diǎn)們itemNodes xmldom.DOMNodeList;--定義節(jié)點(diǎn),存放單個(gè)item節(jié)點(diǎn)itemNode xmldom.DOMNode;ValueReturn VARCHAR2 (100); BEGIN--解析xmlStr中xml字符串,并存放到xmlPar中xmlparser.parseClob (xmlPar, xmlStr);--將xmlPar中的數(shù)據(jù)轉(zhuǎn)存到dom文檔中xDoc := xmlparser.getDocument (xmlPar);xmlparser.freeParser (xmlPar); --釋放解析器實(shí)例--獲取所有item節(jié)點(diǎn)itemNodes := xmldom.getElementsByTagName (xDoc, nodeName);--獲取item節(jié)點(diǎn)的個(gè)數(shù)lenItme := xmldom.getLength (itemNodes);IF lenItme = 0THENRETURN '';END IF;--獲取節(jié)點(diǎn)列表中的第1個(gè)item節(jié)點(diǎn)itemNode := xmldom.item (itemNodes, 0);--獲取所有子節(jié)點(diǎn)的值ValueReturn := xmldom.getNodeValue (xmldom.getFirstChild (itemNode));RETURN ValueReturn; END GetXmlNodeValue; /三:存儲(chǔ)過程.SQL
CREATE OR REPLACE PROCEDURE MIP.MIP_PARSE (xmlStr IN CLOB) ISRENO 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);BEGINRENO := 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 THENFFID_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);ELSEFFID_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; EXCEPTIONWHEN OTHERSTHENDBMS_OUTPUT.PUT_LINE (SQLERRM); END MIP_PARSE; /
四:觸發(fā)器.SQL
DROP TRIGGER MIP.COPY_MIPDATA_TRIGGER;CREATE OR REPLACE TRIGGER MIP.COPY_MIPDATA_TRIGGERAFTER INSERTON MIP.MBINMSGS FOR EACH ROW DECLARE -- LOCAL VARIABLES HERE BEGINMIP_PARSE (:NEW.MBINMSGS_CLOB_MSG); END COPY_MIPDATA_TRIGGER; /五:最后把所有的Function,存儲(chǔ)過程,觸發(fā)器都編譯一下,就可以執(zhí)行了,執(zhí)行過程是:給表MBINMSGS中每插入一條數(shù)據(jù),觸發(fā)器就觸發(fā)存儲(chǔ)過程,存儲(chǔ)過程再調(diào)用Function,最后把解析出來的xml字符串插入到對(duì)應(yīng)的數(shù)據(jù)表中。
總結(jié)
以上是生活随笔為你收集整理的Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段类型中存储的xml字符串...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习:第三章-Linux常用命
- 下一篇: rust 案例_RUST-X气相防锈产品