热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表

摘要:最近项目中用到了Oracle存储过程,所以就自己尝试着写了下,下面我把我遇到的问题描述一下:就是在我处理解析Clob字段中的xml字符串的时候,有个需求就是根据指定的主键参数,来判断该参数的是否已经存在数据表里面,如果存在我就根据这个参数执行Upda

摘要:最近项目中用到了Oracle存储过程,所以就自己尝试着写了下,下面我把我遇到的问题描述一下:就是在我处理解析Clob字段中的xml字符串的时候,有个需求就是根据指定的主键参数,来判断该参数的是否已经存在数据表里面,如果存在我就根据这个参数执行Upda

摘要:最近项目中用到了Oracle存储过程,所以就自己尝试着写了下,下面我把我遇到的问题描述一下:就是在我处理解析Clob字段中的xml字符串的时候,有个需求就是根据指定的主键参数,来判断该参数的值是否已经存在数据表里面,如果存在我就根据这个参数执行Update操作,如果不存在我就执行Save操作:

一:Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中,以及通过Oracle存储过程解析Clob字段中的xml字符串到指定的数据表里面:


二:下面是具体的方法,主要是红色部分,是解决如果根据指定的参数判断该参数的值是否已经存在的数据表中:

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);
   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);
   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);
   FSTD     VARCHAR2 (100);
   OFTM     VARCHAR2 (100);
   STDI     VARCHAR2 (100);
   TSAT     VARCHAR2 (100);
   
   --新增字段
   FLIGHTNUMBER VARCHAR2 (100);
   FLIGHTMARK   VARCHAR2 (100);
   
   --定义出港信息表要格式的时间字段
   A_TOBT_D VARCHAR2 (100);
   ASAT_D   VARCHAR2 (100);
   BCTM_D   VARCHAR2 (100);
   BOTM_D   VARCHAR2 (100);
   BSTM_D   VARCHAR2 (100);
   C_TOBT_D VARCHAR2 (100);
   COBT_D   VARCHAR2 (100);
   CTOT_D   VARCHAR2 (100);
   DINT_D   VARCHAR2 (100);
   DOUT_D   VARCHAR2 (100);
   EDDI_D   VARCHAR2 (100);
   EOBT_D   VARCHAR2 (100);
   EPGT_D   VARCHAR2 (100);
   EPOT_D   VARCHAR2 (100);
   FATD_D   VARCHAR2 (100);
   FSTD_D   VARCHAR2 (100);
   LMDT_D   VARCHAR2 (100);
   OFTM_D   VARCHAR2 (100);
   STDI_D   VARCHAR2 (100);
   TSAT_D   VARCHAR2 (100);
   
   --定义进港信息表要格式化的时间字段
   EIBT_A   VARCHAR2 (100);
   FATA_A   VARCHAR2 (100);
   FETA_A   VARCHAR2 (100);
   FSTA_A   VARCHAR2 (100);
   LMDT_A   VARCHAR2 (100);
   PSTM_A   VARCHAR2 (100);
   SPOT_A   VARCHAR2 (100);
   
   COUNTS   NUMBER(36);
   
   --出港信息要修改的除时间外的字段
   STND_D   VARCHAR2 (100);
   A_WEATHER_D VARCHAR2 (100);
   ABNS_D   VARCHAR2 (100);
   ACFT_D   VARCHAR2 (100);
   AIRLINE_D VARCHAR2 (100);
   DLAB_D   VARCHAR2 (100);
   LMUR_D   VARCHAR2 (100);
   RENO_D   VARCHAR2 (100);
   RWAY_D   VARCHAR2 (100);
   
   -- 进港信息要修改的除时间外的字段
   ABNS_A   VARCHAR2 (100);
   ACFT_A   VARCHAR2 (100);
   AIRLINE_A VARCHAR2 (100);
   CHDT_A   VARCHAR2 (100);
   RENO_A   VARCHAR2 (100);
   LMUR_A   VARCHAR2 (100);
   RWAY_A   VARCHAR2 (100);
   STND_A   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');
   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');
   OFTM := GetXmlNodeValue (xmlStr, 'OFTM');
   STDI := GetXmlNodeValue (xmlStr, 'STDI');
   TSAT := GetXmlNodeValue (xmlStr, 'TSAT');
   
   
   --出港信息表中时间字段的时间格式函数的用法
   A_TOBT_D := FORMATDATEVALUE (A_TOBT, 'A_TOBT_D');
   ASAT_D := FORMATDATEVALUE (ASAT, 'ASAT_D');
   BCTM_D := FORMATDATEVALUE (BCTM, 'BCTM_D');
   BOTM_D := FORMATDATEVALUE (BOTM, 'BOTM_D');
   BSTM_D := FORMATDATEVALUE (BSTM, 'BSTM_D');
   C_TOBT_D := FORMATDATEVALUE (C_TOBT, 'C_TOBT_D');
   COBT_D := FORMATDATEVALUE (COBT, 'COBT_D');
   CTOT_D := FORMATDATEVALUE (CTOT, 'CTOT_D');
   DINT_D := FORMATDATEVALUE (DINT, 'DINT_D');
   DOUT_D := FORMATDATEVALUE (DOUT, 'DOUT_D');
   EDDI_D := FORMATDATEVALUE (EDDI, 'EDDI_D');
   EOBT_D := FORMATDATEVALUE (EOBT, 'EOBT_D');
   EPGT_D := FORMATDATEVALUE (EPGT, 'EPGT_D');
   EPOT_D := FORMATDATEVALUE (EPOT, 'EPOT_D');
   FATD_D := FORMATDATEVALUE (FATD, 'FATD_D');
   FSTD_D := FORMATDATEVALUE (FSTD, 'FSTD_D');
   LMDT_D := FORMATDATEVALUE (LMDT, 'LMDT_D');
   OFTM_D := FORMATDATEVALUE (OFTM, 'OFTM_D');
   STDI_D := FORMATDATEVALUE (STDI, 'STDI_D');
   TSAT_D := FORMATDATEVALUE (TSAT, 'TSAT_D');
   
   --进港信息表中时间字段的时间格式函数的用法
   EIBT_A := FORMATDATEVALUE (EIBT, 'EIBT_A');
   FATA_A := FORMATDATEVALUE (FATA, 'FATA_A');
   FETA_A := FORMATDATEVALUE (FETA, 'FETA_A');
   FSTA_A := FORMATDATEVALUE (FSTA, 'FSTA_A');
   LMDT_A := FORMATDATEVALUE (LMDT, 'LMDT_A');
   PSTM_A := FORMATDATEVALUE (PSTM, 'PSTM_A');
   SPOT_A := FORMATDATEVALUE (SPOT, 'SPOT_A');
   
   --出港信息要修改的除时间外的字段
   STND_D := GetXmlNodeValue (xmlStr, 'STND');
   A_WEATHER_D := GetXmlNodeValue (xmlStr, 'A_WEATHER');
   ABNS_D := GetXmlNodeValue (xmlStr, 'ABNS');
   ACFT_D := GetXmlNodeValue (xmlStr, 'ACFT');
   AIRLINE_D := GetXmlNodeValue (xmlStr, 'AIRLINE');
   DLAB_D := GetXmlNodeValue (xmlStr, 'DLAB');
   LMUR_D := GetXmlNodeValue (xmlStr, 'LMUR');
   RENO_D := GetXmlNodeValue (xmlStr, 'RENO');
   RWAY_D := GetXmlNodeValue (xmlStr, 'RWAY');
   
   --进港信息要修改的除时间外的字段
   ABNS_A := GetXmlNodeValue (xmlStr, 'ABNS');
   ACFT_A := GetXmlNodeValue (xmlStr, 'ACFT');
   AIRLINE_A := GetXmlNodeValue (xmlStr, 'AIRLINE');
   CHDT_A := GetXmlNodeValue (xmlStr, 'CHDT');
   RENO_A := GetXmlNodeValue (xmlStr, 'RENO');
   LMUR_A := GetXmlNodeValue (xmlStr, 'LMUR');
   RWAY_A := GetXmlNodeValue (xmlStr, 'RWAY');
   STND_A := GetXmlNodeValue (xmlStr, 'STND');
   
   
   IF INSTR(FFID,'-D-') > 0 THEN
   
    FFID_D := FFID;
    
    --截取航班号
    FLIGHTNUMBER := SUBSTR(FFID_D,INSTR(FFID_D,'-',1)+1,INSTR(FFID_D,'-',INSTR(FFID_D,'-',1)+1)-INSTR(FFID_D,'-',1)-1);
    
    --截取出港标志
    
    FLIGHTMARK := SUBSTR(FFID_D,INSTR(FFID_D,'-',2,2)+1,INSTR(FFID_D,'-',2,3)-1-INSTR(FFID_D,'-',2,2));
    
    --UPDATE之前要先根据FFID查询一下看看数据表中是否已经存在该条数据,如果存在就UPDATE,如果不存在就SAVE
    
    SELECT COUNT(1) INTO COUNTS FROM TB_CMS_FLGTINFO_D where FFID = FFID_D;
    
    IF COUNTS > 0 THEN 
    
    UPDATE TB_CMS_FLGTINFO_D
    
    SET 
    
    A_TOBT = A_TOBT_D,
    A_WEATHER = A_WEATHER_D,
    ABNS = ABNS_D,
    ACFT = ACFT_D,
    AIRLINE = AIRLINE_D,
    ASAT = ASAT_D,
    BCTM = BCTM_D,
    BOTM = BOTM_D,
    BSTM = BSTM_D,
    C_TOBT = C_TOBT_D,
    COBT = COBT_D,
    CTOT = CTOT_D,
    DINT = DINT_D,
    DLAB = DLAB_D,
    DOUT = DOUT_D,
    EDDI = EDDI_D,
    EOBT = EOBT_D,
    EPGT = EPGT_D,
    EPOT = EPOT_D,
    FATD = FATD_D,
    FSTD = FSTD_D,
    LMDT = LMDT_D,
    LMUR = LMUR_D,
    OFTM = OFTM_D,
    RENO = RENO_D,
    RWAY = RWAY_D,
    STDI = STDI_D,
    STND = STND_D,
    TSAT = TSAT_D
    
    WHERE FFID = FFID_D;
    
    ELSE
    
    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,FLIGHTNUMBER,
               FLIGHTMARK,FSTD,LMDT,LMUR,OFTM,RENO,RWAY,STDI,STND,TSAT)
     VALUES   (FLGTINFO_D_SEQ.NEXTVAL,
               A_TOBT_D,
               A_WEATHER,
               ABNS,
               ACFT,
               AIRLINE,
               ASAT_D,
               BCTM_D,
               BOTM_D,
               BSTM_D,
               C_TOBT_D,
               COBT_D,
               CTOT_D,
               DINT_D,
               DLAB,
               DOUT_D,
               EDDI_D,
               EOBT_D,
               EPGT_D,
               EPOT_D,
               FATD_D,
               FFID_D,
               FLIGHTNUMBER,
               FLIGHTMARK,
               FSTD_D,
               LMDT_D,
               LMUR,
               OFTM_D,
               RENO,
               RWAY,
               STDI_D,
               STND,
               TSAT_D);
    
    END IF;
    
   
   ELSE
   
     FFID_A := FFID;
    
     --截取航班号
     FLIGHTNUMBER := SUBSTR(FFID_A,INSTR(FFID_A,'-',1)+1,INSTR(FFID_A,'-',INSTR(FFID_A,'-',1)+1)-INSTR(FFID_A,'-',1)-1);
    
     --截取出港标志
     FLIGHTMARK := SUBSTR(FFID_A,INSTR(FFID_A,'-',2,2)+1,INSTR(FFID_A,'-',2,3)-1-INSTR(FFID_A,'-',2,2));
     
     --UPDATE之前要先根据FFID查询一下看看数据表中是否已经存在该条数据,如果存在就UPDATE,如果不存在就SAVE
     
     SELECT COUNT(1) INTO COUNTS FROM TB_CMS_FLGTINFO_A where FFID = FFID_A;

     IF COUNTS > 0 THEN
     
     UPDATE TB_CMS_FLGTINFO_A
     
     SET 
     
     ABNS = ABNS_A,
     ACFT = ACFT_A,
     AIRLINE = AIRLINE_A,
     CHDT = CHDT_A,
     RENO = RENO_A,
     EIBT = EIBT_A,
     FATA = FATA_A,
     FETA = FETA_A,
     FSTA = FSTA_A,
     LMDT = LMDT_A,
     LMUR = LMUR_A,
     PSTM = PSTM_A,
     RWAY = RWAY_A,
     SPOT = SPOT_A,
     STND = STND_A
     
     WHERE 
     
     FFID = FFID_A;
     
     ELSE
     
     INSERT INTO TB_CMS_FLGTINFO_A (ID,ABNS,ACFT,AIRLINE,CHDT,FFID,FLIGHTNUMBER,FLIGHTMARK,RENO,EIBT,FATA,FETA,FSTA,LMDT,LMUR,PSTM,RWAY,SPOT,STND)
     
     VALUES   (FLGTINFO_A_SEQ.NEXTVAL,
               ABNS,
               ACFT,
               AIRLINE,
               CHDT,
               FFID_A,
               FLIGHTNUMBER,
               FLIGHTMARK,
               RENO,
               EIBT_A,
               FATA_A,
               FETA_A,
               FSTA_A,
               LMDT_A,
               LMUR,
               PSTM_A,
               RWAY,
               SPOT_A,
               STND);
     
     END IF;
     
   END IF;

   COMMIT;
   
EXCEPTION

   WHEN OTHERS
   
   THEN
   
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
      
END MIP_PARSE;
/

三:详情请看:http://www.zuidaima.com/question/2041312860310528.htm
推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
祖v哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有