Oracle的sequence實(shí)現(xiàn)非常靈活,所以也帶來一些易用性問題,如何取到新插入記錄生成的sequence值與其它數(shù)據(jù)庫有較大差別,本文詳國介紹了5種實(shí)現(xiàn)讀取新插入記錄sequence值的方法。
測試用的數(shù)據(jù)庫腳本:
以上5種方法都可以實(shí)現(xiàn)功能,以下是5種方法的優(yōu)缺點(diǎn)匯總,個(gè)人推薦性能要求一般的業(yè)務(wù)采用第一種方法,性能要求非常高業(yè)務(wù)采用第五種方法。
方法 | 簡介 | 優(yōu)點(diǎn) | 缺點(diǎn) |
方法一 | 先用seq.nextval取出值,然后用轉(zhuǎn)入變量的方式插入 | 代碼簡單直觀,使用的人也最多 | 需要兩次sql交互,性能不佳 |
方法二 | 先用seq.nextval直接插入記錄,再用seq.currval取出新插入的值 | 可以在插入記錄后返回sequence,適合于數(shù)據(jù)插入業(yè)務(wù)邏輯不好改造的業(yè)務(wù)代碼 | 需要兩次sql交互,性能不佳,并且容易產(chǎn)生并發(fā)安全問題 |
方法三 | 用pl/sql塊的returning into語法,用CallableStatement對(duì)象設(shè)置輸出參數(shù)取到新插入的值 | 只要一次sql交互,性能較好 | 需要采用pl/sql語法,代碼不直觀,使用較少 |
方法四 | 設(shè)置PreparedStatement需要返回新值的字段名,然后用getGeneratedKeys取得新插入的值 | 性能良好,只要一次sql交互 | 只有Oracle10g才支持,使用較少 |
方法五 | returning into語法,用OraclePreparedStatement對(duì)象設(shè)置輸出參數(shù),再用getReturnResultSet取得新增入的值 | 性能最好,因?yàn)橹灰淮蝧ql交互,oracle9i也支持 | 只能使用Oracle jdbc特有的OraclePreparedStatement對(duì)象 |
聯(lián)系客服