在Oracle数据库中获取插入行的最后一个ID

12

可能是重复的问题:
PLSQL JDBC:如何获取最后一行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中,这种方式不再起作用。

这些是我的预处理声明:

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表中?


这个问题不是重复的,因为JDBC的Oracle驱动程序工作方式与其他驱动程序不同。 - Enrique San Martín
4个回答

12
如果触发器被配置为自动使用序列中的下一个值设置主键字段,那么您可以按如下方式修改INSERT语句:
INSERT INTO table (field1, field2, field3)
  VALUES (?, ?, ?)
  RETURNING primary_key_field INTO ?

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

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


6

在Oracle中用于自增值的是序列

下一个值是SEQUENCE_NAME.NEXTVAL,上一个使用的值是SEQUENCE_NAME.CURRVAL


谢谢回答。我看到管理员创建表时已经完成了自增。现在我只需要帮助从TR_LOG表中获取ID。 :) - Igor

4
如果我理解正确,您想在一个表T1中插入一条记录,获取插入记录的主键,并将其用作另一个表T2中的外键。在这种情况下,Oracle的returning clause非常有用,您可以像这样使用它(很抱歉我不知道如何在Java中使用它,但您应该能够理解):
declare
  fId int;
begin
  insert into T1(id) values seq1.nextval returning id into fId
end;

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

是的,这正是我想要做的。 :) - Igor

1

您可以在准备语句调用中指定自动递增列

示例:

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

在数据库行插入之后:

ResultSet keys = ps.getGeneratedKeys();

重要提示:此功能仅在自动递增值已通过序列由数据库触发器自动设置时才可使用。

5
你还需要依赖于所使用的JDBC驱动程序。Oracle提供的所有JDBC驱动程序都不支持此功能。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接