摘要:最近項目中用到了存儲過程,觸發器,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.ParserxmlPar 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 = 0THENRETURN '';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)
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;
/
四:觸發器.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,存儲過程,觸發器都編譯一下,就可以執行了,執行過程是:給表MBINMSGS中每插入一條數據,觸發器就觸發存儲過程,存儲過程再調用Function,最后把解析出來的xml字符串插入到對應的數據表中。