摘要:最近项目中用到了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
<span style="color:#cc0000;">SELECT COUNT(1) INTO COUNTS FROM TB_CMS_FLGTINFO_D where FFID = FFID_D;
IF COUNTS > 0 THEN
</span>
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
<span style="color:#cc0000;">SELECT COUNT(1) INTO COUNTS FROM TB_CMS_FLGTINFO_A where FFID = FFID_A;
IF COUNTS > 0 THEN</span>
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
分享到:
相关推荐
执行存储过程,通过指定目标数据库登录信息,动态生成dblink,打开游标,按批次插入本地指定表中,每批次1万条数据。同步记录和日志信息写在自动生成的sync_log表中。同步完成后自动删除动态生成的存储过程、dblink...
日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...
实验66:删除表中指定列操作 142 实验67:使用sqlldr加载外部的数据 143 实验68:使用utl_file包来将表的数据存储到外部文件 144 实验69:使用外部表 145 实验70:处理挂起的事务 146 索引 149 实验71:查看索引的...
文本参数文件的修改是通过直接对文本的修改实现的,通过命令行是无法将修改后的参数值写入该文件中,而服务器初始化参数文件是不能直接修改的,必须通过ALTER SYSTEM语句来进行参数修改的。 7. 简述PL/SQL程序结构及...
§3.8.2 为LOB数据类型指定存储 120 §3.8.3 操作和检索LOB数据 121 §3.9 表和索引有关的数据字典 124 §3.9.1 表和索引数据字典 124 §3.9.2 数据字典查询例子 125 第四章 视图、同义词和序列 128 §4.1 视图 128 ...
当一个基表被修改时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。 每张表最多可建立12 种类型的触发器,它们是: BEFORE INSERT ...
23.3.3 删除存在的数据表 23.4 对数据库中表的操作 23.4.1 向表中添加记录 23.4.2 浏览表中记录 23.4.3 修改已有记录 23.4.4 删除指定记录 23.5 可回复留言板的开发(PHP+SQL Server) 23.5.1 数据表的设计 23.5.2 ...
3.从其它表中拷贝数据 40 二. 更新数据 41 三. 删除数据 42 1.Delete 语句 42 2.Truncate 语句 42 四. SQL*Plus命令 42 1.设置环境变量命令 42 (1)Pause 43 (2)pagesize 和 newpage 43 (3)linesize 43 (4...
每个表的数据和索引都会存在自已的表空间中。 # 3.可以实现单表在不同的数据库中移动。 # 4.空间可以回收(除drop table操作处,表空不能自已回收) # 缺点: # 单表增加过大,如超过100G # 结论: # 共享表空间在...
15.5.2 Oracle中存储过程和函数的管理 第16章 SQL触发器 16.1 触发器的基本概念 16.1.1 触发器简介 16.1.2 触发器执行环境 16.2 SQL Server中的触发器 16.2.1 SQL Server触发器的种类 16.2.2 ...
3 在Load过程中使用的Exception 表有何作用,该如何创建?(原) 70 4如何导出(EXPORT),导入(LOAD)包含由公式生成字段的表 70 5 LOAD命令和自生成列值 72 6 用load命令和identityoverride参数向有identity列的表中...
Closure表针对维度表计算distance,Closure表的生产参见例子中的存储过程sp_zycreateorgclosure 例如: 地区" uniqueMembers="true" nameColumn="ORGENTITYNAME" column="ORGENTITYID" parentColumn=...
中括号部分可选的,判断该数据不存在就创建 4、 切换、使用指定数据库 use dbName; 5、 显示当前使用数据库所有的表对象 show tables; 6、 显示表结构describe(desc) desc tableName; 7、 创建一张表 create ...
15.5.2 oracle中存储过程和函数的管理 324 第16章 sql触发器 325 16.1 触发器的基本概念 325 16.1.1 触发器简介 325 16.1.2 触发器执行环境 325 16.2 sql server中的触发器 326 16.2.1 sql server触发器的种类...
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 (2)存储过程的基本写法...
0925 如何获取数据库中的全部存储过程 540 0926 如何正确认识触发器 541 0927 Update触发器在系统日志中的应用 542 0928 触发器的嵌套使用 542 0929 获取数据库中的触发器 543 19.12 其他 544 0930 在...
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), password varchar2(20) ); create table t_user_temp ( username varchar...
实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式 147 实例116 验证电话号码的格式是否正确 147 实例117 验证Email地址格式是否正确 148 实例118 验证IP地址是否有效 149 实例119 统计关键字的查询结果 150...
实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式 147 实例116 验证电话号码的格式是否正确 147 实例117 验证Email地址格式是否正确 148 实例118 验证IP地址是否有效 149 实例119 统计关键字的查询结果 150...