Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段
摘要:最近项目中用到了存储过程,触发器,Function,由于以前没怎么用过,所以查资料,请教同事,最后总算是把问题解决了,问题是这样的,数据库中有三张表一张是存放从远程服务器获取数据的MBINMSGS表,这个表里面有个Clob字段,里面存放的是xml式的字符串
摘要:最近项目中用到了存储过程,触发器,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字符串插入到对应的数据表中。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

La durée de conservation des journaux de la base de données Oracle dépend du type de journal et de la configuration, notamment : Redo logs : déterminé par la taille maximale configurée avec le paramètre "LOG_ARCHIVE_DEST". Redo logs archivés : Déterminé par la taille maximale configurée par le paramètre "DB_RECOVERY_FILE_DEST_SIZE". Redo logs en ligne : non archivés, perdus au redémarrage de la base de données et la durée de conservation est cohérente avec la durée d'exécution de l'instance. Journal d'audit : Configuré par le paramètre "AUDIT_TRAIL", conservé 30 jours par défaut.

La fonction dans Oracle pour calculer le nombre de jours entre deux dates est DATEDIFF(). L'utilisation spécifique est la suivante : Spécifiez l'unité d'intervalle de temps : intervalle (tel que jour, mois, année) Spécifiez deux valeurs de date : date1 et date2DATEDIFF(interval, date1, date2) Renvoie la différence en jours

La séquence de démarrage de la base de données Oracle est la suivante : 1. Vérifiez les conditions préalables ; 2. Démarrez l'écouteur ; 3. Démarrez l'instance de base de données ; 4. Attendez que la base de données s'ouvre ; 6. Vérifiez l'état de la base de données ; . Activez le service (si nécessaire) ; 8. Testez la connexion.

Le type de données INTERVAL dans Oracle est utilisé pour représenter les intervalles de temps. La syntaxe est INTERVAL <precision> <unit> Vous pouvez utiliser des opérations d'addition, de soustraction, de multiplication et de division pour utiliser INTERVAL, ce qui convient aux scénarios tels que le stockage de données temporelles et. calculer les différences de dates.

Pour trouver le nombre d'occurrences d'un caractère dans Oracle, effectuez les étapes suivantes : Obtenez la longueur totale d'une chaîne ; Obtenez la longueur de la sous-chaîne dans laquelle un caractère apparaît. Comptez le nombre d'occurrences d'un caractère en soustrayant la longueur de la sous-chaîne ; de la longueur totale.

La quantité de mémoire requise par Oracle dépend de la taille de la base de données, du niveau d'activité et du niveau de performances requis : pour le stockage des tampons de données, des tampons d'index, l'exécution d'instructions SQL et la gestion du cache du dictionnaire de données. Le montant exact dépend de la taille de la base de données, du niveau d'activité et du niveau de performances requis. Les meilleures pratiques incluent la définition de la taille SGA appropriée, le dimensionnement des composants SGA, l'utilisation d'AMM et la surveillance de l'utilisation de la mémoire.

Exigences de configuration matérielle du serveur de base de données Oracle : Processeur : multicœur, avec une fréquence principale d'au moins 2,5 GHz Pour les grandes bases de données, 32 cœurs ou plus sont recommandés. Mémoire : au moins 8 Go pour les petites bases de données, 16 à 64 Go pour les tailles moyennes, jusqu'à 512 Go ou plus pour les grandes bases de données ou les charges de travail lourdes. Stockage : disques SSD ou NVMe, matrices RAID pour la redondance et les performances. Réseau : réseau haut débit (10GbE ou supérieur), carte réseau dédiée, réseau à faible latence. Autres : alimentation stable, composants redondants, système d'exploitation et logiciels compatibles, dissipation thermique et système de refroidissement.

La méthode de remplacement de chaînes dans Oracle consiste à utiliser la fonction REPLACE La syntaxe de cette fonction est : REPLACE(string, search_string, replace_string). Étapes d'utilisation : 1. Identifiez la sous-chaîne à remplacer ; 2. Déterminez la nouvelle chaîne pour remplacer la sous-chaîne ; 3. Utilisez la fonction REPLACE pour remplacer. L'utilisation avancée inclut : les remplacements multiples, le respect de la casse, le remplacement des caractères spéciaux, etc.
