本人自毕业以来一直从事java软件开发工作,工作中大部分数据库都是使用的Oracle,碰到的问题总结一下(随时更新)。

  1.sql中使用group by 分组时select 后面直接出现的字段也应当出现在group by 的后面;

  1. select id,name from t_user group by id,name<!--正确-->
  2. select id,name from t_user group by id<!--错误-->

  2.使用mybatis查询的结果集使用java类接收的话字段的大小写由java类字段大小写决定,而使用Map接收的话Map的键key会是大写,如果需要小写可以使用字段别名;

  1. <select resultType="java.util.Map"> <!--Map中键为ID和NAME-->
  2. select id,name from t_user
  3. </select>
  4.  
  5. <select resultType="java.util.Map"> <!--Map中键为id和name-->
  6. select id "id",name as "name" from t_user
  7. </select>

  3.wm_concat(column)是Oracle中的函数,用来合并同列字段,在低版本的oracle中返回的是varchar值,而在高版本的oracle中的值却是clob属性!!!(使用Map接收查询结果集要注意)

  1. select order_code,wm_concat(project_name) from t_order group by order_code;
  2. select order_code,to_char(wm_concat(project_name)) from t_order group by order_code

   4.查询语句使用order by 排序时,如果order by 后面跟的时单纯的字符串的话,并不会报错。

  之所以会发现这个问题是因为项目中的列表查询有一个需求:列表的排序需要从数据库排序。即从前台传入需要排序的字段与排序方式,mybatis的#{}会将sql预编译一遍,然后在传入的变量前后加上" ' "插入在相应的位置,导致实际执行的sql并不符合排序的需求,不得已使用 ${}传入变量。

  1. --orderBy = user_code desc
  2. select * from t_user ordey by #{orderBy};
  3. select * from t_user order by 'user_code desc';
  4.  
  5. select * from t_user ordey by ${orderBy};
  6. select * from t_user order by user_code desc;

  5、oracle 某字段为空时,使用is null才能判断出改字段的值,字段不为空时使用= 与 != 均无法判断出来

  创建一张测试表,字段与数据如图:

  数据:

  (1)执行sql

  1. select * from t_test where test_number = '55555'

  结果: 没什么问题。

  (2)执行sql

  1. select * from t_test where test_number != '55555'

  结果:

  出现问题了,查询  !=  的条件该列为空的情况并没有出现在查询结果中。

  (3)执行sql

  1. select * from t_test where test_number is null

  结果:

  (4)执行sql

  1. select * from t_test where test_number is not null

  结果:

  由此可见,当查询条件中的字段包含空值时,这一部分值需要通过 is null 或者 is not null 才能筛选出来!!!

  6、使用mybatis 的selectKey返回新增数据的id,需要注意序列需要至少调用一次nextval后,才能使用currval返回当前序列中的值

  新增数据自增id序列及触发器sql如下:

  1. -- Create sequence
  2. create sequence t_test_id_seq
  3. minvalue 1
  4. maxvalue 999999999999999999999999
  5. start with 1
  6. increment by 1
  7. cache 20;
  8.  
  9. -- Create trigger
  10. CREATE OR REPLACE TRIGGER t_test_id_trig
  11. BEFORE INSERT OR UPDATE ON t_test
  12. FOR EACH ROW
  13. DECLARE
  14. v_newVal NUMBER(12) := 0;
  15. v_incval NUMBER(12) := 0;
  16. BEGIN
  17. IF INSERTING AND :new.id IS NULL THEN
  18. SELECT t_test_id_seq.NEXTVAL INTO v_newVal FROM DUAL;
  19. IF v_newVal = 1 THEN
  20. SELECT NVL(max(id), 0)
  21. INTO v_newVal
  22. FROM t_test;
  23. v_newVal := v_newVal + 1;
  24. LOOP
  25. EXIT WHEN v_incval >= v_newVal;
  26. SELECT t_test_id_seq.nextval
  27. INTO v_incval
  28. FROM dual;
  29. END LOOP;
  30. END IF;
  31. :new.id := v_newVal;
  32. END IF;
  33. END;

  在mapper.xml中写法如下

  1. <insert id="insertTestData" parameterType="com.bvdata.test.Test">
  2. insert into t_test (test_number) values (#{test_number})
  3. <selectKey keyProperty="id" resultType="Integer" order="AFTER">
  4. select t_test_id_seq.currval from dual
  5. </selectKey>
  6. </insert>

  当创建完成序列t_test_id_seq后,第一次执行sql

  1. select t_test_id_seq.currval from dual

   会出现错误:

  当执行sql

  1. select t_test_id_seq.nextval from dual;
  2. select t_test_id_seq.currval from dual;

这时currval就可以直接使用了。

在开发过程中遇到的Oracle的坑及开发技巧的更多相关文章

  1. sass开发过程中遇到的几个坑

    1.安装sass被墙的问题 安装完`ruby`后,打开`ruby cmd` 输入`gem install sass`,安装失败,有可能是镜像源的问题,也有可能是墙的问题. 因为公司内网的奇葩限制,各种 ...

  2. 【开发技巧】再见,BLE的那些坑!

    蓝牙,平常你用的多吗?上班路上戴着蓝牙耳机听音乐.看视频打开蓝牙分享个人热点给小伙伴们解锁共享单车时,打开蓝牙就能迅速解锁...... BLE-蓝牙低能耗技术,方便了我们的生活,但是开发者在开发过程中 ...

  3. 记一次开发过程中,iview遇到的一些坑以及解决办法

    写在开头:本次项目采用的是vue2.0+iview3.0,最近公司没啥事,来总结一下开发过程中遇到的问题. 1.Modal关闭问题 需求背景:modal框里面是个form表单,点击确定之后,先验证fo ...

  4. 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发

    现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧.  我们自己之前做公众号发红包,做了两三 ...

  5. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的   最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想 ...

  6. android开发过程中遇到的坑

    在android的学习过程中,会有很多坑,我会把我遇到的,一一列下来,方便后来者查阅! 1:android-support-v4.jar and android-support-v7-appcompa ...

  7. ionic开发过程中遇到的一些坑!

    总结一些:在使用 ionic 开发过程中所遇到的问题. 问题一:Cannot find module '@ionic/app-scripts' 描述:使用 ionic start 项目的时候,项目安装 ...

  8. EntityFramework CodeFirst SQLServer转Oracle踩坑笔记

    接着在Oracle中使用Entity Framework 6 CodeFirst这篇博文,正在将项目从SQLServer 2012转至Oracle 11g,目前为止遇到的问题在此记录下. SQL Se ...

  9. 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结

    开发<客户关系管理系统(CRM)>软件过程,也就是一个标准的Winform程序的开发过程,我们可以通过这个典型的软件开发过程来了解目前的开发思路.开发理念,以及一些必要的高效率手段.本篇随 ...

随机推荐

  1. gitlab导入备份数据

    1.将南阳的gitlab 迁入到本地80虚拟机 由于本地ip地址没有固定,所以,是本地去拉取南阳的代码,虽然,之后固定了ip,但,由于只用一次这样的操作,所以,还是一直在做拉取而不是推送的工作 2.具 ...

  2. 设备树DTS 学习:3-常用的DTS 函数

    Linux内核中目前DTS相关的函数都是以of_前缀开头的,它们的实现位于内核源码的drivers/of下面 void __iomem*of_iomap(struct device_node *nod ...

  3. vue+element 递归上传图片

    直接上代码. <template>   <div>     <el-upload       action="http://localhost:3000/pic ...

  4. Arch系统软件列表

    1. 安装统计 2. 安装列表 3. 安装说明 4. 作为依赖项的安装列表 5. 更正 mangaro使用减的方式安装系统.开箱即用的豪华版本,大部分人需要的都有了,同样包括个别用户不需要的,配置方面 ...

  5. phpStudy隐藏后门预警

    1.事件背景 近日,使用广泛的PHP环境集成程序包phpStudy被公告疑似遭遇供应链攻击,程序包自带PHP的php_xmlrpc.dll模块隐藏有后门,安恒应急响应中心和研究院随即对国内下载站点提供 ...

  6. 使用线程池测试cpu的并发计算能力

    接到一个需求是测试一下cpu并发计算能力,针对int和float求和单位时间能执行几次的问题.可能是服务器选型用到的参数. 开始使用的是fork-join,但是发现fork-join每次得到的结果值波 ...

  7. 用Python实现简单的服务器【新手必学】

    如何实现服务器... socket接口是实际上是操作系统提供的系统调用.socket的使用并不局限于Python语言,你可以用C或者JAVA来写出同样的socket服务器,而所有语言使用socket的 ...

  8. 005.Oracle数据库 , 查询多字段连接合并,并添加文本内容

    /*Oracle数据库查询日期在两者之间*/ SELECT PKID , OCCUR_DATE, PKID || ' 曾经沧海难为水 ' ||TO_CHAR( OCCUR_DATE, ' yyyy/m ...

  9. CSS样式表——样式2

    样式 5)边界边框 margin:0px;                                            //外边距为0 margin:10px 0px 0px 10px;   ...

  10. 微信浏览器 UA

    mozilla/5.0 (linux; android 5.1.1; mi note pro build/lmy47v) applewebkit/537.36 (khtml, like gecko) ...