在OracleDB11.2.0.4和ojdbc6.jar中,是否有方法避免从序列预取ID以批量插入记录

在OracleDB11.2.0.4和ojdbc6.jar中,是否有方法避免从序列预取ID以批量插入记录,jdbc,batch-processing,oracle11gr2,Jdbc,Batch Processing,Oracle11gr2,我有一个为表生成主键的序列。使用jdbc,我试图批量插入到表中。有没有办法避免预取序列 Oracle数据库11.2.0.4 ojdbc6.jar 一些堆栈溢出帖子表明Oracle 12c不支持语句上的“getGeneratedKeys”方法。您可以使用表上的触发器从数据库内部填充主键列,从而避免了获取键然后插入键的往返过程 例如,如果您的表名为MYTABLE,则 CREATE OR REPLACE TRIGGER MYTABLE before insert on MYTABLE for

我有一个为表生成主键的序列。使用jdbc,我试图批量插入到表中。有没有办法避免预取序列

Oracle数据库11.2.0.4 ojdbc6.jar


一些堆栈溢出帖子表明Oracle 12c不支持语句上的“getGeneratedKeys”方法。

您可以使用表上的触发器从数据库内部填充主键列,从而避免了获取键然后插入键的往返过程

例如,如果您的表名为MYTABLE,则

CREATE OR REPLACE TRIGGER  MYTABLE
  before insert on MYTABLE
  for each row  
begin   
  if :NEW.MYTABLE_ID is null then 
    select MYTABLE_SEQ.nextval into :NEW.MYTABLE_ID from dual; 
  end if; 
  end; 
如果在insert之后需要应用程序中的密钥值,可以在insert语句中使用RETURNING INTO子句来执行insert并在单个语句中将密钥返回到应用程序层

如果要避免触发,可以在insert语句中使用sequence.nextval

INSERT INTO MYTABLE (my_id, first_name, last name) value (MYSEQUENCE.nextval, ?, ?) RETURNING MY_ID into ?  

我不喜欢使用触发器,因为它是应用层不知道的副作用。是的,使用MYSEQUENCE.nexval是最好的选择。但是,如果我在我的表中使用INSERT,我的id、名字、姓氏值为MYSEQUENCE.nextval?并使用jdbc编写的语句。我可以使用JDBC 4.0规范指定的getGeneratedKeys获取所有生成的主键吗?文档与其他问题一致,因此批量更新不支持该功能。您是否考虑过使用全局临时表作为解决方法。。。插入GTT,选择返回主键,然后插入。。从…起将GTT复制到主表。然后提交以清空GTT在提交时使用的删除行应答。考虑到我计划插入的记录量,500k,GTT相当于使用序列。再多浏览一点,我想,要么我应该更改数据定义并使用应用程序生成的UUID来避免额外的往返,要么我可以使用。