oracle怎么得到插值 oracle插數(shù)據(jù)

如何獲取新插入Oracle數(shù)據(jù)庫(kù)Sequence值的5種方法

獲取新插入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;

}

ORACLE 中怎么插入空值?

看看是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')

oracle中如何對(duì)表進(jìn)行插值,有默認(rèn)值的情況下

如果表已經(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)

外貿(mào)網(wǎng)站建設(shè)