OracleOracle11g之实用技术–将数据插入Oracle数据库时怎么样赢得其rowId

Oracle11g之实用技术–将数据插入Oracle数据库时怎么得到其rowId Oracle11g生出很多之新特征,相信各位都从很多沟渠明白及了(注:还非清楚的请看http://wmdata.com.cn/oracle/11g/index.asp?froms=blog),在那么些,我首要介绍一下怎么以Oracle11g着插入数据时取得RowId,并发表一下,才察觉的稍秘密。

于稍微应用场景下,大家要以用数据插入到数据库时,再次回到rowId。Oracle有相同长回来语句。其语法如下:

INSERT INTO <table_name>
(column_list)
VALUES
(values_list)
RETURNING <value_name>
INTO <variable_name>;

而是于插入数据后,如何获取rowId呢?
当JDBC中,可以运用Callback语句去执行Procedure,因而,大家可以从连对象来Callback语句,并推行插入命令的SQL脚本,这样坐起目的得到再次来到值。这些重中之重是怎么着勾勒这条插入语句?并且怎样去调用语句以及哪些赢得返回值。
 
以下是本人的测试代码。

创办测试数据库

创建一个表FI_T_USER,那个表包含2配段,第一独凡是主键USER_ID,另一个凡是USER_NAME。成立语句子如下:

create table FI_T_USER(
    USER_ID varchar2(20) primary key,
    USER_NAME varchar2(100)
);

描绘测试代码

以下是自之测试代码:

 

/*
 * File name: TestInsertReturnRowId.java
 * 
 * Version: v1.0
 * 
 * 
 */
package test.com.sinosoft.database;

import java.sql.*;

import oracle.jdbc.OracleTypes;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sinosoft.database.DBConnectionPool;
import com.sinosoft.database.SqlQueryUtils;
import com.sinosoft.exception.SDBException;

/**
 * 
 * 
 * 测试调用JDBC,往Oracle惨遭插入数据,再次来到对应之ROWID
 */
public class TestInsertReturnRowId {
    private static final Log log = LogFactory
            .getLog(TestInsertReturnRowId.class);

    public static void main(String[] args) {
        TestInsertReturnRowId tester = new TestInsertReturnRowId();
        String rowId = tester.insertUser(“Stephen”, “liwp”);
        System.out.println(“The rowId is:” + rowId);
    }

    public String insertUser(String userId, String userName) {
        if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(userName)) {
            log.error(“Please specify the userId and userName”);
            return null;
        }
        // check whether the user has already in the database
        String querySQL = “select count(1) as cnt from FI_T_USER where USER_ID = ‘”
                + userId + “‘”;
        // insert statement
        String insertSQL = “begin insert into FI_T_USER(USER_ID, USER_NAME) values(?,?) return rowid into ?;end;”;
        Connection con = DBConnectionPool.getConnection(“test”);
        if (con == null) {
            log.error(“Error on get the connection!”);
            return null;
        }
        try {
            int rowCount = SqlQueryUtils.getIntValue(querySQL, con);
            if (rowCount != 0) {
                log.error(“User with userId = ” + userId + ” already exists!”);
                return null;
            }
            // insert the data to the database
            CallableStatement cs = con.prepareCall(insertSQL);
            cs.setString(1, userId);
            cs.setString(2, userName);
            cs.registerOutParameter(3, OracleTypes.VARCHAR);
            cs.execute();
            String rowId = cs.getString(3);
            return rowId;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (SDBException e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

眼看中间特别重点的代码是指定插入SQL脚论就句:

String insertSQL = “begin insert into FI_T_USER(USER_ID, USER_NAME)
values(?,?) return rowid into ?;end;”;

连下去的重即使,注册输出参数,并以尽语句后拿走这参数。

这多少个代码很是有因而,不仅可以以Oracle11g达标用,还可支撑Oracle10与Oracle
9.2。

吓了,本文起头所陈述,我意识的之Oracle11g的秘闻就是是:
Oracle11g克以以数据导出备份时压缩数量,并且效能惊人。据Oracle11g白皮书中牵线,压缩率可达到74.67%
,
本文重要介绍的是以Oracle11g遭到之实用技巧—插入数据时拿到RowId,至于压缩嘛,就生破有机遇再次写了。

相关文章