我在从表中获取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表中写入该值?
答案 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通过序列自动设置时才有效