Oracle的sequence实现非常灵活,所以也带来一些易用性问题,如何取到新插入记录生成的sequence值与其它数据库有较大差别,下面介绍了5种实现读取新插入记录sequence值的方法。
测试用的数据库脚本:
- SQL> create table T1
- 2 (
- 3 ID NUMBER
- 4 );
-
- Table created
- SQL> create sequence SEQ_T1;
-
- Sequence created
复制代码 以上5种方法都可以实现功能,以下是5种方法的优缺点汇总,个人推荐性能要求一般的业务采用第一种方法,性能要求非常高业务采用第五种方法。
方法
| 简介
| 优点
| 缺点
| 方法一
| 先用seq.nextval取出值,然后用转入变量的方式插入
| 代码简单直观,使用的人也最多
| 需要两次sql交互,性能不佳
| 方法二
| 先用seq.nextval直接插入记录,再用seq.currval取出新插入的值
| 可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码
| 需要两次sql交互,性能不佳,并且容易产生并发安全问题
| 方法三
| 用pl/sql块的returning into语法,用CallableStatement对象设置输出参数取到新插入的值
| 只要一次sql交互,性能较好
| 需要采用pl/sql语法,代码不直观,使用较少
| 方法四
| 设置PreparedStatement需要返回新值的字段名,然后用getGeneratedKeys取得新插入的值
| 性能良好,只要一次sql交互
| 只有Oracle10g才支持,使用较少
| 方法五
| returning into语法,用OraclePreparedStatement对象设置输出参数,再用getReturnResultSet取得新增入的值
| 性能最好,因为只要一次sql交互,oracle9i也支持
| 只能使用Oracle jdbc特有的OraclePreparedStatement对象
|
|