在开发过程中遇到的Oracle的坑及开发技巧
本人自毕业以来一直从事java软件开发工作,工作中大部分数据库都是使用的Oracle,碰到的问题总结一下(随时更新)。
1.sql中使用group by 分组时select 后面直接出现的字段也应当出现在group by 的后面;
select id,name from t_user group by id,name<!--正确-->
select id,name from t_user group by id<!--错误-->
2.使用mybatis查询的结果集使用java类接收的话字段的大小写由java类字段大小写决定,而使用Map接收的话Map的键key会是大写,如果需要小写可以使用字段别名;
<select resultType="java.util.Map"> <!--Map中键为ID和NAME-->
select id,name from t_user
</select> <select resultType="java.util.Map"> <!--Map中键为id和name-->
select id "id",name as "name" from t_user
</select>
3.wm_concat(column)是Oracle中的函数,用来合并同列字段,在低版本的oracle中返回的是varchar值,而在高版本的oracle中的值却是clob属性!!!(使用Map接收查询结果集要注意)
select order_code,wm_concat(project_name) from t_order group by order_code;
select order_code,to_char(wm_concat(project_name)) from t_order group by order_code
4.查询语句使用order by 排序时,如果order by 后面跟的时单纯的字符串的话,并不会报错。
之所以会发现这个问题是因为项目中的列表查询有一个需求:列表的排序需要从数据库排序。即从前台传入需要排序的字段与排序方式,mybatis的#{}会将sql预编译一遍,然后在传入的变量前后加上" ' "插入在相应的位置,导致实际执行的sql并不符合排序的需求,不得已使用 ${}传入变量。
--orderBy = user_code desc
select * from t_user ordey by #{orderBy};
select * from t_user order by 'user_code desc'; select * from t_user ordey by ${orderBy};
select * from t_user order by user_code desc;
5、oracle 某字段为空时,使用is null才能判断出改字段的值,字段不为空时使用= 与 != 均无法判断出来
创建一张测试表,字段与数据如图:
数据:
(1)执行sql
select * from t_test where test_number = '55555'
结果:
没什么问题。
(2)执行sql
select * from t_test where test_number != '55555'
结果:
出现问题了,查询 != 的条件该列为空的情况并没有出现在查询结果中。
(3)执行sql
select * from t_test where test_number is null
结果:
(4)执行sql
select * from t_test where test_number is not null
结果:
由此可见,当查询条件中的字段包含空值时,这一部分值需要通过 is null 或者 is not null 才能筛选出来!!!
6、使用mybatis 的selectKey返回新增数据的id,需要注意序列需要至少调用一次nextval后,才能使用currval返回当前序列中的值
新增数据自增id序列及触发器sql如下:
-- Create sequence
create sequence t_test_id_seq
minvalue 1
maxvalue 999999999999999999999999
start with 1
increment by 1
cache 20; -- Create trigger
CREATE OR REPLACE TRIGGER t_test_id_trig
BEFORE INSERT OR UPDATE ON t_test
FOR EACH ROW
DECLARE
v_newVal NUMBER(12) := 0;
v_incval NUMBER(12) := 0;
BEGIN
IF INSERTING AND :new.id IS NULL THEN
SELECT t_test_id_seq.NEXTVAL INTO v_newVal FROM DUAL;
IF v_newVal = 1 THEN
SELECT NVL(max(id), 0)
INTO v_newVal
FROM t_test;
v_newVal := v_newVal + 1;
LOOP
EXIT WHEN v_incval >= v_newVal;
SELECT t_test_id_seq.nextval
INTO v_incval
FROM dual;
END LOOP;
END IF;
:new.id := v_newVal;
END IF;
END;
在mapper.xml中写法如下
<insert id="insertTestData" parameterType="com.bvdata.test.Test">
insert into t_test (test_number) values (#{test_number})
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select t_test_id_seq.currval from dual
</selectKey>
</insert>
当创建完成序列t_test_id_seq后,第一次执行sql
select t_test_id_seq.currval from dual
会出现错误:
当执行sql
select t_test_id_seq.nextval from dual;
select t_test_id_seq.currval from dual;

这时currval就可以直接使用了。
在开发过程中遇到的Oracle的坑及开发技巧的更多相关文章
- sass开发过程中遇到的几个坑
1.安装sass被墙的问题 安装完`ruby`后,打开`ruby cmd` 输入`gem install sass`,安装失败,有可能是镜像源的问题,也有可能是墙的问题. 因为公司内网的奇葩限制,各种 ...
- 【开发技巧】再见,BLE的那些坑!
蓝牙,平常你用的多吗?上班路上戴着蓝牙耳机听音乐.看视频打开蓝牙分享个人热点给小伙伴们解锁共享单车时,打开蓝牙就能迅速解锁...... BLE-蓝牙低能耗技术,方便了我们的生活,但是开发者在开发过程中 ...
- 记一次开发过程中,iview遇到的一些坑以及解决办法
写在开头:本次项目采用的是vue2.0+iview3.0,最近公司没啥事,来总结一下开发过程中遇到的问题. 1.Modal关闭问题 需求背景:modal框里面是个form表单,点击确定之后,先验证fo ...
- 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发
现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧. 我们自己之前做公众号发红包,做了两三 ...
- 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的
微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的 最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想 ...
- android开发过程中遇到的坑
在android的学习过程中,会有很多坑,我会把我遇到的,一一列下来,方便后来者查阅! 1:android-support-v4.jar and android-support-v7-appcompa ...
- ionic开发过程中遇到的一些坑!
总结一些:在使用 ionic 开发过程中所遇到的问题. 问题一:Cannot find module '@ionic/app-scripts' 描述:使用 ionic start 项目的时候,项目安装 ...
- EntityFramework CodeFirst SQLServer转Oracle踩坑笔记
接着在Oracle中使用Entity Framework 6 CodeFirst这篇博文,正在将项目从SQLServer 2012转至Oracle 11g,目前为止遇到的问题在此记录下. SQL Se ...
- 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结
开发<客户关系管理系统(CRM)>软件过程,也就是一个标准的Winform程序的开发过程,我们可以通过这个典型的软件开发过程来了解目前的开发思路.开发理念,以及一些必要的高效率手段.本篇随 ...
随机推荐
- 关于Tomcat部署项目的点点滴滴
在给客户部署环境时,我们不可能想开发一样,在编辑软件部署一下tomcat就可以正常运行.我们也应该清楚java的运行机制**“先编译,后解释”**的原则.(如下图)![图片描述][1]那么在Tomca ...
- swoole之建立 tcp server
一.swoole的安装 参照官网:https://wiki.swoole.com/wiki/page/6.html 二.代码部分 服务端: <?php $host = "127.0.0 ...
- hbase hbck及region RIT处理
hbase hbck主要用来检查hbase集群region的状态以及对有问题的region进行修复. hbase hbck :检查hbase所有表的一致性,如果正常,就会Print OK hbase ...
- python中numpy矩阵运算操作大全(非常全)!
python中numpy矩阵运算操作大全(非常全) //2019.07.10晚python矩阵运算大全1.矩阵的输出形式:对于任何一个矩阵,python输出的模板是:import numpy as n ...
- Vue2.x双向数据绑定
1.vue双向绑定原理 vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Arrays
import java.util.* ; public class ArraysDemo{ public static void main(String arg[]){ int temp[] = {3 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-cog
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 一文详解scala泛型及类型限定
今天知识星球球友,微信问浪尖了一个spark源码阅读中的类型限定问题.这个在spark源码很多处出现,所以今天浪尖就整理一下scala类型限定的内容.希望对大家有帮助. scala类型参数要点 1. ...
- js实现二叉查找树
二叉树的特点: 像一颗树一样,从顶端往下延伸,最顶端的为根节点,每个节点下面子节点的数不超过两个,没有任何子节点的节点被称为叶子节点, 除了根节点和叶子节点的被称为中间节点. 二叉查找树: 每个节 ...
- Redis 详解 (二) redis的配置文件介绍
目录 1.开头说明 2.INCLUDES 3.MODULES 4.NETWORK 5.GENERAL 6.SNAPSHOTTING 7.REPLICATION 8.SECURITY 9.CLIENTS ...