我正在构建一个java程序来将数据插入到我的oracle数据库中。 我的问题是我需要插入两个表,并且为了达到我在TABLE_A触发器中使用的唯一行,然后在序列中插入get next val之前触发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)
答案 0 :(得分:2)
您可以使用INSERT语句中的RETURNING子句来完成此操作:
INSERT INTO table_a ( name,date) val ( 'Ryan','2014.01.01') RETURNING id INTO ?
答案 1 :(得分:2)
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/