使用java获取插入行到Oracle

Posted

技术标签:

【中文标题】使用java获取插入行到Oracle【英文标题】:Get inserted row to Oracle with java 【发布时间】:2014-09-01 14:26:29 【问题描述】:

我正在构建一个 java 程序来将数据插入到我的 oracle 数据库中。 我的问题是我需要插入两个表,并在插入获取序列中的下一个 val 之前达到我在 TABLE_A 触发器中为 id 使用的唯一行。 但我需要 TABLE_B 相同的 id 进行连接。 (我无法获得 getval,因为如果另一个用户使用该程序怎么办......) 所以我需要以某种方式达到,当我使用 executeql(sql) 命令作为回报时,我会看到我提交的内容。

现在我使用我有名称和日期,所以我选择了刚刚插入名称和日期的 id。 但它不是最好的,因为在一天内我可以插入更多的名字。所以现在这不会是唯一的。 喜欢:

insert into table a ( name,date) val ( 'Ryan','2014.01.01')

这里的id是按顺序自动递增的

比另一个sql运行:

inert into table_b  ( id,someval) val ( select id from table_a where
name ='Ryan', date='2014.01.01, 23)

所以我需要类似的东西:

 system.out.println(smtp.executesql(sql).whatIinsertednow())
*than console:* '1 row insered (id,name,date) : ( 1, Ryan, 2014.01.01)

【问题讨论】:

您可以将生成的 ID 值取回like this;你已经拥有了其余的价值观了吗? 【参考方案1】:

PreparedStatement prepareStatement = connection.prepareStatement("insert...",

        new String[]  "your_primary_key_column_name" );

prepareStatement.executeUpdate();

ResultSet generatedKeys = prepareStatement.getGeneratedKeys();
if (null != generatedKeys && generatedKeys.next()) 
     Long primaryKey = generatedKeys.getLong(1);

我找到了完美的答案。我可以从 JAVA 插入,并用密钥返回。

完整版:

CREATE TABLE STUDENTS
(
   STUDENT_ID   NUMBER NOT NULL PRIMARY KEY,
   NAME         VARCHAR2 (50 BYTE),
   EMAIL        VARCHAR2 (50 BYTE),
   BIRTH_DATE   DATE
);


CREATE SEQUENCE STUDENT_SEQ
   START WITH 0
   MAXVALUE 9999999999999999999999999999
   MINVALUE 0;

还有 Java 代码

String QUERY = "INSERT INTO students "+
               "  VALUES (student_seq.NEXTVAL,"+
               "         'Harry', 'harry@hogwarts.edu', '31-July-1980')";

// load oracle driver
Class.forName("oracle.jdbc.driver.OracleDriver");

// get database connection from connection string
Connection connection = DriverManager.getConnection(
        "jdbc:oracle:thin:@localhost:1521:sample", "scott", "tiger");

// prepare statement to execute insert query
// note the 2nd argument passed to prepareStatement() method
// pass name of primary key column, in this case student_id is
// generated from sequence
PreparedStatement ps = connection.prepareStatement(QUERY,
        new String[]  "student_id" );

// local variable to hold auto generated student id
Long studentId = null;

// execute the insert statement, if success get the primary key value
if (ps.executeUpdate() > 0) 

    // getGeneratedKeys() returns result set of keys that were auto
    // generated
    // in our case student_id column
    ResultSet generatedKeys = ps.getGeneratedKeys();

    // if resultset has data, get the primary key value
    // of last inserted record
    if (null != generatedKeys && generatedKeys.next()) 

        // voila! we got student id which was generated from sequence
        studentId = generatedKeys.getLong(1);
    


来源:http://viralpatel.net/blogs/oracle-java-jdbc-get-primary-key-insert-sql/

【讨论】:

【参考方案2】:

您可以通过在 INSERT 语句中使用 RETURNING 子句来实现:

INSERT INTO table_a ( name,date) val ( 'Ryan','2014.01.01') RETURNING id INTO ?

【讨论】:

但是我怎样才能在 java 中得到它呢? (JDBC) 看看this solution on SO

以上是关于使用java获取插入行到Oracle的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中按组不使用聚合函数或行到列

使用 rowid 从一个表更新百万行到另一个 Oracle

使用 Java spring 和休眠的 Oracle 插入需要太多时间

Oracle操纵数据库表

从 JSONArray 插入/更新 +10000 行到 SqLite 时如何防止应用程序崩溃

如何获取新插入Oracle数据库Sequence值的5种方法