【问题标题】:Doing an INSERT ALL using JDBC in ORACLE在 ORACLE 中使用 JDBC 执行 INSERT ALL
【发布时间】:2018-02-06 05:37:29
【问题描述】:

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

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

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

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 插入 TABLE2。 我知道在 INSERT ALL 语句中使用select test_ctrl.seq_test_id.nextval FROM dual 是不正确的。但它是 Oracle 我不能使用 SCOPE_IDENTITY()

请建议我怎样才能使这个查询工作

【问题讨论】:

  • ...因为您在 oracle(和裸 jdbc)上,PL/SQL 可以(轻松)包装它(全部插入)并存储 id(在变量中)......

标签: java sql oracle jdbc


【解决方案1】:

“但它是 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.

【讨论】:

    【解决方案2】:

    我似乎找到了我的问题的答案。像这样修改查询。请注意 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
    

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多