获取Oracle DB中插入行的最后一个ID

时间:2010-12-16 08:30:05

标签: java oracle jdbc

  

可能重复:
  PLSQL JDBC: How to get last row ID?

我在从表中获取ID时遇到问题。我有两个表AJPES_TR和TR_LOG,并且TR_LOG表中的PK被设置为AJPES_TR表中的外键。

在TR_LOG表中,我只是编写从哪个文件数据导入,我想将该PK链接到主表。在mySQL中我使用getID.last(); int j = getID.getInt(TR_LOG_ID);做得很好但是现在在Oracle中这已不再适用了。

这些是我的PreparedStatements:

PreparedStatement insertData = 
  con.prepareStatement(
    "INSERT INTO T_AJPES_TR(rn,sSpre,reg,eno,davcna,Ime,Priimek) VALUES (?,?,?,?,?,?,?)"
  );
PreparedStatement select_file_log = 
  con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG WHERE File_import = ?"
);
PreparedStatement getID = con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG");
PreparedStatement insertFile = 
  con.prepareStatement(
    "INSERT INTO T_AJPES_TR_LOG(Date_import,File_import) VALUES (?,?)"
  );

在mySQL中,ID被设置为自动增量。

如何从TR_LOG获取ID值并在AJPES_TR表中写入该值?

4 个答案:

答案 0 :(得分:12)

如果触发器配置为使用序列中的下一个值自动设置主键字段,则可以按如下方式修改INSERT语句:

INSERT INTO table (field1, field2, field3)
  VALUES (?, ?, ?)
  RETURNING primary_key_field INTO ?

然后,为INSERT添加参数值,在主键的末尾添加输出参数,然后执行查询。

执行查询后,获取输出参数的值。它应该包含primary_key_field的值。

答案 1 :(得分:6)

在Oracle中使用sequences

的自动增量值

下一个值为SEQUENCE_NAME.NEXTVAL,上次使用了SEQUENCE_NAME.CURRVAL

答案 2 :(得分:4)

如果我理解你正确,你想在一个表T1中插入一条记录,获取插入记录的PK,并使用另一个表T2作为FK。在这种情况下,Oracle returning clause非常有用,您可以像这样使用它(对不起,我不知道在Java中使用它,但你应该明白这一点):

declare
  fId int;
begin
  insert into T1(id) values seq1.nextval returning id into fId
end;

插入后,您将在fId变量中创建记录ID。

答案 3 :(得分:2)

您可以在prepare语句调用

中发出自动增量列的信号

示例:

PreparedStatement ps = con.prepareStatement(sql, pkColumns);

插入数据库行后:

ResultSet keys = ps.getGeneratedKeys();

重要提示:仅当自动增量值由DB-Trigger通过序列自动设置时才有效