獲取新插入Oracle數(shù)據(jù)庫(kù)Sequence值的5種方法如下:
創(chuàng)新互聯(lián)建站專注于宿松網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供宿松營(yíng)銷型網(wǎng)站建設(shè),宿松網(wǎng)站制作、宿松網(wǎng)頁(yè)設(shè)計(jì)、宿松網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造宿松網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供宿松網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
//公共代碼:得到數(shù)據(jù)庫(kù)連接
public Connection getConnection() throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:dbname", "username", "password");
return conn;
}
//方法一
//先用select seq_t1.nextval as id from dual 取到新的sequence值。
//然后將最新的值通過(guò)變量傳遞給插入的語(yǔ)句:insert into t1(id) values(?)
//最后返回開(kāi)始取到的sequence值。
//這種方法的優(yōu)點(diǎn)代碼簡(jiǎn)單直觀,使用的人也最多,缺點(diǎn)是需要兩次sql交互,性能不佳。
public int insertDataReturnKeyByGetNextVal() throws Exception {
Connection conn = getConnection();
String vsql = "select seq_t1.nextval as id from dual";
PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql);
ResultSet rs=pstmt.executeQuery();
rs.next();
int id=rs.getInt(1);
rs.close();
pstmt.close();
vsql="insert into t1(id) values(?)";
pstmt =(PreparedStatement)conn.prepareStatement(vsql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
System.out.print("id:"+id);
return id;
}
//方法二
//先用insert into t1(id) values(seq_t1.nextval)插入數(shù)據(jù)。
//然后使用select seq_t1.currval as id from dual返回剛才插入的記錄生成的sequence值。
//注:seq_t1.currval表示取出當(dāng)前會(huì)話的最后生成的sequence值,由于是用會(huì)話隔離,只要保證兩個(gè)SQL使用同一個(gè)Connection即可,對(duì)于采用連接池應(yīng)用需要將兩個(gè)SQL放在同一個(gè)事務(wù)內(nèi)才可保證并發(fā)安全。
//另外如果會(huì)話沒(méi)有生成過(guò)sequence值,使用seq_t1.currval語(yǔ)法會(huì)報(bào)錯(cuò)。
//這種方法的優(yōu)點(diǎn)可以在插入記錄后返回sequence,適合于數(shù)據(jù)插入業(yè)務(wù)邏輯不好改造的業(yè)務(wù)代碼,缺點(diǎn)是需要兩次sql交互,性能不佳,并且容易產(chǎn)生并發(fā)安全問(wèn)題。
public int insertDataReturnKeyByGetCurrVal() throws Exception {
Connection conn = getConnection();
String vsql = "insert into t1(id) values(seq_t1.nextval)";
PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql);
pstmt.executeUpdate();
pstmt.close();
vsql="select seq_t1.currval as id from dual";
pstmt =(PreparedStatement)conn.prepareStatement(vsql);
ResultSet rs=pstmt.executeQuery();
rs.next();
int id=rs.getInt(1);
rs.close();
pstmt.close();
System.out.print("id:"+id);
return id;
}
//方法三
//采用pl/sql的returning into語(yǔ)法,可以用CallableStatement對(duì)象設(shè)置registerOutParameter取得輸出變量的值。
//這種方法的優(yōu)點(diǎn)是只要一次sql交互,性能較好,缺點(diǎn)是需要采用pl/sql語(yǔ)法,代碼不直觀,使用較少。
public int insertDataReturnKeyByPlsql() throws Exception {
Connection conn = getConnection();
String vsql = "begin insert into t1(id) values(seq_t1.nextval) returning id into :1;end;";
CallableStatement cstmt =(CallableStatement)conn.prepareCall ( vsql);
cstmt.registerOutParameter(1, Types.BIGINT);
cstmt.execute();
int id=cstmt.getInt(1);
System.out.print("id:"+id);
cstmt.close();
return id;
}
//方法四
//采用PreparedStatement的getGeneratedKeys方法
//conn.prepareStatement的第二個(gè)參數(shù)可以設(shè)置GeneratedKeys的字段名列表,變量類型是一個(gè)字符串?dāng)?shù)組
//注:對(duì)Oracle數(shù)據(jù)庫(kù)這里不能像其它數(shù)據(jù)庫(kù)那樣用prepareStatement(vsql,Statement.RETURN_GENERATED_KEYS)方法,這種語(yǔ)法是用來(lái)取自增類型的數(shù)據(jù)。
//Oracle沒(méi)有自增類型,全部采用的是sequence實(shí)現(xiàn),如果傳Statement.RETURN_GENERATED_KEYS則返回的是新插入記錄的ROWID,并不是我們相要的sequence值。
//這種方法的優(yōu)點(diǎn)是性能良好,只要一次sql交互,實(shí)際上內(nèi)部也是將sql轉(zhuǎn)換成oracle的returning into的語(yǔ)法,缺點(diǎn)是只有Oracle10g才支持,使用較少。
public int insertDataReturnKeyByGeneratedKeys() throws Exception {
Connection conn = getConnection();
String vsql = "insert into t1(id) values(seq_t1.nextval)";
PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql,new String[]{"ID"});
pstmt.executeUpdate();
ResultSet rs=pstmt.getGeneratedKeys();
rs.next();
int id=rs.getInt(1);
rs.close();
pstmt.close();
System.out.print("id:"+id);
return id;
}
//方法五
//和方法三類似,采用oracle特有的returning into語(yǔ)法,設(shè)置輸出參數(shù),但是不同的地方是采用OraclePreparedStatement對(duì)象,因?yàn)閖dbc規(guī)范里標(biāo)準(zhǔn)的PreparedStatement對(duì)象是不能設(shè)置輸出類型參數(shù)。
//最后用getReturnResultSet取到新插入的sequence值,
//這種方法的優(yōu)點(diǎn)是性能最好,因?yàn)橹灰淮蝧ql交互,oracle9i也支持,缺點(diǎn)是只能使用Oracle jdbc特有的OraclePreparedStatement對(duì)象。
public int insertDataReturnKeyByReturnInto() throws Exception {
Connection conn = getConnection();
String vsql = "insert into t1(id) values(seq_t1.nextval) returning id into :1";
OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql);
pstmt.registerReturnParameter(1, Types.BIGINT);
pstmt.executeUpdate();
ResultSet rs=pstmt.getReturnResultSet();
rs.next();
int id=rs.getInt(1);
rs.close();
pstmt.close();
System.out.print("id:"+id);
return id;
}
看看是null值還是“ ”值。一般的是不允許null值,但是可以插入空值“”或者“ ”
解決辦法————————————
判斷一下用戶提交的值
if(test!=null!test.equlas("")){
}
先不說(shuō)你空值用0表示的問(wèn)題,
就是opdate=sysdate估計(jì)你也很難得到結(jié)果,sysdate表示系統(tǒng)當(dāng)前時(shí)間,包含時(shí)分秒,你那個(gè)opdate怎么可能會(huì)和sysdate相等呢?
真的要是把空值用0表示的話,oracle中有nvl函數(shù)
select nvl(workbillid,0) from kf_workbill
意思就是把workbillid字段為空的顯示成0,當(dāng)然也可以顯示成任何字符或者數(shù)字。
友情提醒一下:
你那個(gè)opdate=sysdate是不是該改成
to_char(opdate,'yyyymmdd')=to_char(sysdate,'yyyymmdd')
如果表已經(jīng)存在,用如下方法設(shè)置默認(rèn)值。
1
alter?table?表名?modify?字段名?default?默認(rèn)值;
如test表中設(shè)置age字段為30,可用如下語(yǔ)句:
1
alter?table?test?modify?age?default?30;
測(cè)試:
添加一條記錄:
1
insert?into?test?(name)?values?('du小智');
結(jié)果:
這里可以看到du小智的默認(rèn)age則為30。
網(wǎng)頁(yè)名稱:oracle怎么得到插值 oracle插數(shù)據(jù)
標(biāo)題網(wǎng)址:http://muchs.cn/article46/hphdeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、企業(yè)建站、域名注冊(cè)、做網(wǎng)站、App設(shè)計(jì)、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)