如何在jdbc中获取oracle10g刚刚插入的一条记录的 序列.nextval 生成的主键?

囧南风囧 发布于 2011/08/28 22:17
阅读 4K+
收藏 1
如何在jdbc中获取oracle10g刚刚插入的一条记录的 序列.nextval 生成的主键?
加载中
1
宏哥
宏哥
returning id
scl33
scl33
我记得insert在某些版本(例如9i)貌似不能returnning, 只能在UPDATE/DELETE能returnning?
1
opal
opal
搞那么复杂干嘛?思路转变一下,先取得 序列.nextval的值,然后用这个值插入记录不就完了?
囧南风囧
囧南风囧
还有请问,若并发量大,会产生问题吗?
囧南风囧
囧南风囧
请你指的先获得 序列.nextval 是用哪种方法?我试过在select语句中直接select 序列.nextval 不行!我倒是看到有一种方法是select db的用户序列表中对应该表的序列,然后查处lastvalue!
dy810810
dy810810
本来就应该这样。
1
囧南风囧
囧南风囧
哟哟哟,和气生财,和气生财啊!非常感谢几位网友的热情讨论啊,我问题已解决,可能别人还有其他的问题呢!咋们先去吃个美味的午餐吧!
0
囧南风囧
囧南风囧

引用来自“宏哥”的答案

returning id
确实是returning id,但是要用到callableStatment,并且前后要有begin/end,成了一个存储过程
0
宏哥
宏哥

引用来自“囧南风囧”的答案

这里的小朋友们完全没有事务概念,他们看不懂
宏哥
宏哥
@mark35 : 也是一样的。区别是用returning id这种方法,如果插入数据失败,是无法获得id值。如果用select nextval这种情况,有可能实际插入失败,仍然获得id值,这个在建立数据关联的时候是很危险的。所以说,returning id是非常严谨的。
mark35
mark35
@宏哥 : 在事务中采用select nextval('seq')如果失败而回滚,seq是不会回滚的,所以就会造成seq的空洞。不知道RETURNING id会是什么情况。
dy810810
dy810810
@宏哥 : 算了,不解释也不苟同,好吧。请看opal的回复,看不懂的话自己猜。
宏哥
宏哥
@dy810810 : 我在这个帖子里面的回答是标准方法,是工业标准。 先取nextval是需要两次数据库访问,更复杂,不容易维护一致性。如果插入失败呢?程序非常容易出错。
dy810810
dy810810
@宏哥 : 你真的理解opal在说什么吗?
下一页
0
宏哥
宏哥

引用来自“dy810810”的答案

@宏哥 : 你真的理解opal在说什么吗?
我只用了两个单词,楼主就知道什么意思了。你们这些mysqler除了会喷,还会做什么?opal是什么东西,我不知道。
宏哥
宏哥
@dy810810 : 先搞清谁是1楼。
dy810810
dy810810
原来你老人家选择性忽视啊,第一楼的回复都没看。 我只是想让你老人家看看别人的解决方法,仅此而已。 我有喷吗?倒是你老人家这么抓狂干什么。。。。
0
宏哥
宏哥

引用来自“宏哥”的答案

引用来自“dy810810”的答案

@宏哥 : 你真的理解opal在说什么吗?
我只用了两个单词,楼主就知道什么意思了。你们这些mysqler除了会喷,还会做什么?opal是什么东西,我不知道。
你先搞清楚时间顺序。
0
zstacks
zstacks
说话小心打击面太广了哦,技术论坛,何苦呢,@红薯 要营造这个专业社区也不容易啊
0
宏哥
宏哥

再说一遍:

returning id 是最严谨,最简洁的方法。严格保证了只有数据插入成功才会返回。

 

返回顶部
顶部