Home Database Mysql Tutorial Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段

Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段

Jun 07, 2016 pm 03:32 PM
function oracle storage trigger tune process pass

摘要:最近项目中用到了存储过程,触发器,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
)
Copy after login

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)
)
Copy after login

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)
)
Copy after login


二: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;
/
Copy after login


三:存储过程.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;
/
Copy after login


四:触发器.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;
/
Copy after login


五:最后把所有的Function,存储过程,触发器都编译一下,就可以执行了,执行过程是:给表MBINMSGS中每插入一条数据,触发器就触发存储过程,存储过程再调用Function,最后把解析出来的xml字符串插入到对应的数据表中。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1670
14
PHP Tutorial
1274
29
C# Tutorial
1256
24
What to do if the oracle can't be opened What to do if the oracle can't be opened Apr 11, 2025 pm 10:06 PM

Solutions to Oracle cannot be opened include: 1. Start the database service; 2. Start the listener; 3. Check port conflicts; 4. Set environment variables correctly; 5. Make sure the firewall or antivirus software does not block the connection; 6. Check whether the server is closed; 7. Use RMAN to recover corrupt files; 8. Check whether the TNS service name is correct; 9. Check network connection; 10. Reinstall Oracle software.

How to solve the problem of closing oracle cursor How to solve the problem of closing oracle cursor Apr 11, 2025 pm 10:18 PM

The method to solve the Oracle cursor closure problem includes: explicitly closing the cursor using the CLOSE statement. Declare the cursor in the FOR UPDATE clause so that it automatically closes after the scope is ended. Declare the cursor in the USING clause so that it automatically closes when the associated PL/SQL variable is closed. Use exception handling to ensure that the cursor is closed in any exception situation. Use the connection pool to automatically close the cursor. Disable automatic submission and delay cursor closing.

How to create cursors in oracle loop How to create cursors in oracle loop Apr 12, 2025 am 06:18 AM

In Oracle, the FOR LOOP loop can create cursors dynamically. The steps are: 1. Define the cursor type; 2. Create the loop; 3. Create the cursor dynamically; 4. Execute the cursor; 5. Close the cursor. Example: A cursor can be created cycle-by-circuit to display the names and salaries of the top 10 employees.

How to export oracle view How to export oracle view Apr 12, 2025 am 06:15 AM

Oracle views can be exported through the EXP utility: Log in to the Oracle database. Start the EXP utility, specifying the view name and export directory. Enter export parameters, including target mode, file format, and tablespace. Start exporting. Verify the export using the impdp utility.

What to do if the oracle log is full What to do if the oracle log is full Apr 12, 2025 am 06:09 AM

When Oracle log files are full, the following solutions can be adopted: 1) Clean old log files; 2) Increase the log file size; 3) Increase the log file group; 4) Set up automatic log management; 5) Reinitialize the database. Before implementing any solution, it is recommended to back up the database to prevent data loss.

Oracle's Role in the Business World Oracle's Role in the Business World Apr 23, 2025 am 12:01 AM

Oracle is not only a database company, but also a leader in cloud computing and ERP systems. 1. Oracle provides comprehensive solutions from database to cloud services and ERP systems. 2. OracleCloud challenges AWS and Azure, providing IaaS, PaaS and SaaS services. 3. Oracle's ERP systems such as E-BusinessSuite and FusionApplications help enterprises optimize operations.

What steps are required to configure CentOS in HDFS What steps are required to configure CentOS in HDFS Apr 14, 2025 pm 06:42 PM

Building a Hadoop Distributed File System (HDFS) on a CentOS system requires multiple steps. This article provides a brief configuration guide. 1. Prepare to install JDK in the early stage: Install JavaDevelopmentKit (JDK) on all nodes, and the version must be compatible with Hadoop. The installation package can be downloaded from the Oracle official website. Environment variable configuration: Edit /etc/profile file, set Java and Hadoop environment variables, so that the system can find the installation path of JDK and Hadoop. 2. Security configuration: SSH password-free login to generate SSH key: Use the ssh-keygen command on each node

How to stop oracle database How to stop oracle database Apr 12, 2025 am 06:12 AM

To stop an Oracle database, perform the following steps: 1. Connect to the database; 2. Shutdown immediately; 3. Shutdown abort completely.

See all articles