对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种 第一种是最常用的,判断count(*)的是否为零,如下 declare v_cnt number; begin select count(*) into v_cnt from T_VIP where col=1; if v_cnt = 0

对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种

第一种是最常用的,判断count(*)的值是否为零,如下

declare

v_cnt number;

begin

select count(*) into v_cnt from T_VIP where col=1;

if v_cnt = 0 then

dbms_output.put_line('无记录');

end if;

end;

首先这种写法让人感觉很奇怪,明明只需要知道表里有没有记录,却去统计了全表的记录数。

这种方式对于小表而言可以接受,一旦表记录很多的时候,性能问题就非常严重

因此有人就作了些修改,改成 select count(*) into v_cnt from T_VIP where col=1 and rownum=1

看起来似乎解决了性能问题,但是分析执行计划可以知道,实际上是一样的,不推荐使用。

第二种是所谓进攻式编程,不作预先判断,而是直接默认通过判断,然后使用 exception 来捕获异常

比如我这里不判断表中是否有满足条件的记录,默认它有,如果没有就在异常中进行处理

declare

v_1 number;

begin

select vip_level into v_1 from T_VIP where 1=0;

exception

when no_data_found then

dbms_output.put_line('无记录');

end;

这种方式从性能上讲比第一种要好得多

不过首先它没办法适应所有的情况,如第一段代码它就没办法改造

其次这种代码看起来让人觉得好像是发生了异常,而不是正常运行,从而造成混乱,不推荐使用。

第三种是利用 Oracle 原有的 Exists 语法,如下

declare

v_cnt number;

begin

select count(*)

into v_cnt

from dual

where exists (select * from t_vip where col=1);

if v_cnt = 0 then

dbms_output.put_line('无记录');

end if;

end;

通过在语句的外面套上一层dual,来使用oracle原有的exists语法

虽然和第一种看起来类似,但分析执行计划可以知道,性能比以上两种都要好得多,与MSSQL的 if exists 最接近,推荐使用。

可以把判断封装成一个函数以方便使用,代码如下

CREATE OR REPLACE FUNCTION EXISTS2 (IN_SQL IN VARCHAR2)

RETURN NUMBER

IS

/**********************************************************

* 使用示例

* begin

* if EXISTS2('select * from dual where 1=1')=1 then

* dbms_output.put_line('有记录');

* else

* dbms_output.put_line('无记录');

* end if;

* end;

*****************************************************************/

V_SQL VARCHAR2(4000);

V_CNT NUMBER(1);

BEGIN

V_SQL := 'SELECT COUNT(*) FROM DUAL WHERE EXISTS (' || IN_SQL || ')';

EXECUTE IMMEDIATE V_SQL INTO V_CNT;

RETURN(V_CNT);

END;

-

对于常用的insert判断还有更简单的写法,比如以下代码

if not exists(select * from table1 where id=1)

insert into table1 values(1,'a');

可以改写成

insert

when (not exists(select * from table1 where id=1)) then

into table1

select 1 as id, 'a' as data from dual;

-

再比如以下的代码

if not exists(select * from table1 where id=2)

insert into table1 values(2,'b')

else

update table1 set data='b' where id=2;

可以改写成

merge into table1 his

using

(

select 2 as id, 'b' as data from dual

) src

on (his.id=src.id)

when matched then

update set his.data=src.data where id=src.id

when not matched then

insert values(src.id,src.data);

-

这里附带说下,有人喜欢把count(*)写成count(列名),不推荐后一种,因为列名是需要额外的操作,去查询系统表来定位列信息

另外count(1)和count(*)没有差别,推荐使用count(*)直观明了

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

oracle有没有mysql if_Oracle中没有 if exists(...)相关推荐

  1. Oracle迁移到MySQL性能下降的注意点

    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障.在我的记忆里面淘宝最初从Oracle ...

  2. MYSQL,Oracle,SQL数据库在JSP中的驱动

    MYSQL,Oracle,SQL数据库在JSP中的驱动 datasource.url=jdbc:mysql://localhost:3306/bbscs6?useUnicode=true&ch ...

  3. oracle可以迁徙mysql吗_项目oracle迁徙到mysql的小总结

    项目oracle迁移到mysql的小总结 1.更新表的不同 oracle update IP_GN_BAXX_GBXX_LS SJXT_ID = #provinceSystemId# JLID = # ...

  4. 淘宝 oracle mysql_Oracle 与 MySQL 的区别-阿里云开发者社区

    Oracle 与 MySQL 的区别 1.在ORACLE中用select * from all_users显示所有的用户,而在MYSQL中显示所有数据库的命令是show databases.对于我的理 ...

  5. mysql dba工作笔记pdf_社区专家在线:Oracle数据库、MySQL、Db2 等数据库日常运维故障与性能调优在线答疑...

    数据库的重要性毋庸置疑,随着数据量日益增加,数据库的重要性更为凸显.DBA们作为数据库的日程运维管理人员,肩负着数据库运维的重要使命.一名合格的DBA,日常工作中需要掌握多项技能,包括数据库的故障诊断 ...

  6. db platform mysql_数据库移植: 从Oracle移植到MySQL 注意databasePlatform | 学步园

    采用Spring框架.JPA操作数据库开发一个小网站过程中,遇到需要将数据库从Oracle移植到MySQL,在进行单元测试时遇到如下错误: Internal Exception: com.mysql. ...

  7. oracle数据库跟mysql的区别_关于Oracle数据库与MySQL数据库的几点区别

    Oracle数据库与MySQL数据库的区别是本文我们主要要介绍的内容,接下来我们就开始介绍这部分内容,希望能够对您有所帮助. Oracle与MySQL的区别: 1.在Oracle中用select * ...

  8. linux mysql 存储过程乱码,mysql存储过程中 乱码问题解决办法

    中文乱码无论在何时都是一个头疼的问题,mysql的存储过程参数也同样存在这个问题. 1.直接使用insert into语句没问题,能够正常插入汉字. 2.把insert into语句移到Procedu ...

  9. Oracle触发器和MySQL触发器之间的区别

    原文链接:http://blog.csdn.net/a19881029/article/details/37820363 --------------------------------------- ...

最新文章

  1. Cassandra数据模型设计最佳实践
  2. Fiddler抓包使用教程-断点调试
  3. AngularJS ui-router (嵌套路由)
  4. 沙盒单机网站代表-Steam【推荐】
  5. 01-iOS之wifi通讯开发简介
  6. LCA 最近公共祖先(RMQ、树上倍增、Tarjan),树上两点距离,线段重合长度
  7. Linux下V4L2编程小结
  8. mysql DDL数据定义语言
  9. 【渝粤教育】电大中专建筑材料作业 题库
  10. leetcode 403. 青蛙过河(dp)
  11. Luogu P1031 均分纸牌(贪心)
  12. CV Code | 计算机视觉开源周报 20190505期
  13. 三星5G手机全球销量200万台:年底将翻番
  14. Redis学习总结(4)——Spring Data操作Redis
  15. Emgu.CV.CvInvoke的类型初始值设定项引发异常
  16. URAL 1992 CVS 可持久化链栈
  17. Linux嵌入式_详解从原理图到数据手册解析PWM蜂鸣器实现
  18. 【信息系统项目管理师】第四章 项目整体管理(考点汇总篇)
  19. 基于SSM+VUE的交通事故案例库系统(前后端分离)
  20. Mac 配置远程服务器 - 免密登陆

热门文章

  1. 老板分分钟要急需应急海报怎么做?PSD分层万能模板帮你解决燃眉之急!
  2. 设计界新人不用再苦找资源网站啦!一流导航神器收藏起来!
  3. 电商夏季促销海报设计PSD模板,分解教你如何设计
  4. python文件读写方法手机,python文本文件读写的3种方法
  5. paging modes-分页模式
  6. Linux内存管理:知识点总结(ARM64)
  7. git词汇表:gitglossary(7) Manual Page
  8. 用OpenSSL写一个简单的Server/Client程序:证书与私钥
  9. 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器
  10. python os模块下载_python os模块