摘要:最近项目中用到了存储过程,触发器,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字符串插入到对应的数据表中。

Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段类型中存储的xml字符串...相关推荐

  1. Oracle中通过Function,存储过程,触发器,调用实现解析Clob字段中存在的xml字符串...

    摘要:接着之前的问题,在Oracle数据库中通过Function,存储过程,触发器实现解析数据表中CLOB大数据字段中存在的xml字符串有时,有个特殊的时间字符串要在数据库格式化处理,之前解析过来的时 ...

  2. Oracle中通过游标执行带参数的存储过程实现解析CLOB字段内的xml字符串:

    摘要:近来之前的项目数据出现了问题,原因是由于之前在设计数据库的时候把时间字段设置成了字符串格式,所以给后期的数据操作带来了很大的麻烦,这里提醒一下各位程序猿,以后在开发项目的时候时间字段一定要是时间 ...

  3. Oracle中如何查询CLOB字段类型的内容

    2019独角兽企业重金招聘Python工程师标准>>> Oracle中如何查询CLOB字段类型的内容 [sql] view plain copy select * from tabl ...

  4. hibernate oracle clob 注解,Hibernate3.X实现基于CLOB字段类型的注解方式:

    一:Hibernate3.X实现基于CLOB字段类型的注解方式的例子:下面直接上代码: 二:UserInfo.java package cn.gov.csrc.cms.model; import ja ...

  5. Oracle存储过程中使用游标来批量解析CLOB字段里面的xml字符串:

    摘要:之前在项目中使用到了Oracle数据库中通过触发器去调用存储过程执行数据解析并Update到对应的数据表中,但是,经过一段时间的测试使用发现,如果job那天停掉了,然后你再重新新建job的话,这 ...

  6. mysql与oracle存储过程_MySQL与Oracle差异比较之五存储过程Function

    存储过程&Function 编号 类别 oracle Mysql 注释 1 创建存储过程语句不同 create or replace procedure P_ADD_FAC( id_fac_c ...

  7. 探究oracle clob字段是怎样存储的

    clob字段存储的是文本,假设存储少于4000个字节则clob字段会和记录存放在一起,假设存储超过4000个字节,则不会与记录存放在一起. 值得注意的是,这里的4000个字节并非等同于varchar2 ...

  8. java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用

    触发器和存储过程是为了提高SQL的运行效率. SQL语句先编译.后执行,而触发器与存储过程都会提前预编译完成,且只编译一次,供反复调用. 随着时代的进步,硬件与带宽的提升,触发器和存储过程提升效率并不 ...

  9. mysql 显示各列的数据类型命令_mysql中查看库中某个表的所有列和对应的字段类型...

    执行命令: select COLUMN_NAME ,DATA_TYPE from information_schema.COLUMNS where table_name = '表名' and tabl ...

最新文章

  1. “池哥昼”的一件趣事
  2. APP元素事件操作API
  3. cnn识别mnist、Fashion-MNIST(pytorch)
  4. 符号常量和变量有什么区别_“变量”和“常量”,计算机程序中的那个“量”是什么“量”...
  5. 域控 正在应用计算机设置,域控制器下发的用户组策略在ou内的用户上没有应用...
  6. 1 vmware 如何联网,以及行命令令初步
  7. rabbitmq——镜像队列
  8. 【gulp】----gulp的使用
  9. 2种方式解决vue路由跳转未匹配相应路由避免出现空白页面或者指定404页面
  10. Microsoft Visual Studio Ultimate 2013 RC 离线安装程序
  11. Linux 常用但较容易忘记的命令
  12. 研究validation插件到现在的感受
  13. 半透明效果的实现方式
  14. java 字符串的字节数_在Java中怎么计算字符编码和字符串所占字节数 .
  15. 汇智创科机器人,【汇智创科机器人】这个周六,和孩子一起“动手不动口”,比比看谁最棒!...
  16. iPad的尺寸与分辨率
  17. Python三方库:RabbitMQ基本使用
  18. 链路聚合(eth-trunk)
  19. 微信小程序连接百度地图API实现天气查询
  20. special effects - 鼠标点击,出现烟花炸裂效果

热门文章

  1. php值对象模式场景,php设计模式介绍之值对象模式第1/5页
  2. Tecplot如何导入多个DAT文件后激活solution time按钮
  3. php ldap支付,php – 实现LDAP合规性
  4. git add remote_最全的git常用命令(建议收藏)
  5. C++求复数的角度_人教A版高中数学必修二7.1 复数的概念优质课公开课课件、教案...
  6. java ldap 分页_具有从属引用的 LDAP 分页查询未正确处理
  7. 解决链接错误:error LNK2001: 无法解析的外部符号 __iob
  8. 计算机工程与应用查重吗,计算机工程期刊录用率_计算机工程与应用期刊_计算机八大核心期刊...
  9. python可以实现操作系统管理_Python并发编程 —— 操作系统基础
  10. centos7 安装redis_Redis6安装(上) - 单机单实例