在ORACLE中使用JDBC执行INSERT ALL

时间:2018-02-06 05:37:30

标签: java sql oracle jdbc

我使用的是Oracle Database 12c企业版

我想将记录插入到2个表中,使用JDBC将TABLE1和TABLE2背靠背地插入。这两个表具有基于公共列的主键和外键关系,如ID_COLUMN

我计划使用以下单个查询并通过JDBC通过我的Java应用程序激活它:

insert all 
  into TABLE1 (ID_COLUMN,COL2,COL3,COL4,COL5,COL6) values(?,?,?,?,?,?)
  into TABLE2 (COL1_1,COL_1_2,COL_1_3,ID_COLUMN) values('blah',42,'rubbish', 
   select test_ctrl.seq_test_id.nextval FROM dual) 
  select * from dual;

我的基本要求是我需要从当前会话中使用TABLE1中的最新ID_COLUMN INSERT TABLE2。 我知道INSERT ALL语句中select test_ctrl.seq_test_id.nextval FROM dual的用法不正确。但它是Oracle我不能使用SCOPE_IDENTITY()

请建议我如何才能使此查询正常工作

2 个答案:

答案 0 :(得分:0)

  

“但它是Oracle我不能使用SCOPE_IDENTITY()”

啊,但你可以。在Oracle 12c中,他们引入了标识列:这些是虚拟列的特殊变体。

create table my_table (
    id number generated always as identity 
    ....
    , constraint my_table_pk primary key (id)

Find out more.

答案 1 :(得分:0)

我似乎找到了我的问题的答案。修改了这样的查询。请注意edme_ctrl.seq_ts_annotation_id.nextval和edme_ctrl.seq_ts_annotation_id.currval

INSERT ALL INTO "SPI7CG_CgNvI".X$ANNOTATIONS(ANNOTATION_ID,CATEGORY,REASON,COMMENTS,AUTHOR,ADJUSTMENT_TYPE,ADJUSTMENT_VALUE) VALUES (edme_ctrl.seq_ts_annotation_id.nextval, '51','33','Test Bulk Insert','kshiam','A',10) INTO "SPI7CG_CgNvI".X$DATA_ANNOTATIONS(ANNOTATION_ID, TABLE_NAME, TABLE_ROW_ID,COLUMN_NAME) VALUES (edme_ctrl.seq_ts_annotation_id.currval,'W$XXXXXGNVBSNSSNDCTRSSR007',164921155,'IVXXXXXGNVBXWGSQDTWQRTR0003') select * from dual