2010-12-16 37 views
12

可能重复:
PLSQL JDBC: How to get last row ID?获取有关插入行最后一个ID在Oracle数据库

我有问题,从表中获取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表?

+0

这个问题是不重复的,因为jdbc的oracle驱动程序工作不同于其他驱动程序 – 2016-04-01 17:38:04

回答

6

在Oracle所使用sequences

下一个值自动增加值是SEQUENCE_NAME.NEXTVAL,最后使用SEQUENCE_NAME.CURRVAL

+0

感谢您的回答。那么当管理员创建表时,我看到自动增量已经完成了。 所以现在只需要帮助我从TR_LOG表中获取ID。:) – Igor 2010-12-16 09:39:20

2

你能信号在准备语句调用自动递增列

实施例:

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

数据库行的插入后:

ResultSet keys = ps.getGeneratedKeys(); 

重要:这仅适用于,如果自动增量值已经自动由DB-触发通过序列

+4

您还依赖于使用的JDBC驱动程序。 Oracle提供的JDBC驱动程序都不支持这一点。 – BalusC 2010-12-23 13:36:08

4

如果我理解你正确,你要插入一个表格T1一个记录集,得到插入记录的PK和使用在另一个表T2中作为FK。在这种情况下,甲骨文returning clause是非常有用的,你可以使用它像这样(对不起,我不知道热在Java中使用它,但你应该明白我的意思):

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

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

+0

是的,这正是我想要做的。 :) – Igor 2010-12-16 10:49:22

12

如果触发器被配置为自动设置主键字段从序列中的下一个值,那么你可以修改你的INSERT语句如下:

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

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

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

相关问题