【问题标题】:How to execute multiple oracle queries using single connection?如何使用单个连接执行多个 oracle 查询?
【发布时间】:2019-07-28 17:51:33
【问题描述】:

我的数据库中有 3 个表,它们的架构看起来像,

Table1 (Col1 Pk, Col2), 
Table2 (Col3 Pk, Col1 FK, Col4)
Table3 (Col5 Pk, Col3 FK, Col6)

这里主键列的值在每次插入操作时自动递增。 我想在上表中插入值。在上述情况下,除非我有 Col3 的值(Table2 的外键),否则我无法插入 Table3,类似地插入 Table2 也不会通过,除非我有 Col1 的值(Table1 的外键)

问题: 如何在单个数据库连接中插入上述表?

我总是可以进行 3 次不同的调用并插入值,但是我如何使用 Table1 中的值并将其插入到 Table2 中,同样地使用 Table2 的值并使用它在单个连接中插入到 Table3 中?

我想写一个存储过程,但不确定如何获取 Col1 值并使用它插入 Table2。

请在这里提出一些想法。举个例子也会有所帮助。

谢谢。

【问题讨论】:

标签: sql database oracle


【解决方案1】:

我想,你正在寻找这个。只需使用Returning 检索 PK 值并在下一次插入时使用该值

declare
    v_col1_id number(10) := null;
    v_col3_id number(10) := null;
begin
    insert into T1 (col2) values ('xxx') RETURNING col1 INTO v_col1_id; -- col1 - PK
    insert into T2 (col1, col4) values (v_col1_id, 'yyy') RETURNING col3 INTO v_col3_id; -- col3 - PK
    insert into T3 (col3, col6) values (v_col3_id , 'zzz'); -- col5 - PK
end;
/

【讨论】:

  • 不要这样做。 “返回”是一个非标准 SQL。
  • @battlmonstr 你有更好的方法来做同样的事情吗?
  • 我想如果您可以编写存储过程,这很好。看看solutions here,它们都是基于序列/nextval 的。也许自动增量通常不是标准的,必须使用各种专有扩展。
  • @VrushankDoshi Returning 就是为了这个。如果您只使用标准 SQL,您将无处可去。你做什么,你写 RDBMS 特定的 sql。你尽可能写标准,如果不可能,你分开。例如,在 Sql Server 中,使用OUTPUT INSERTED 可以实现相同的目的。所以我们在代码中所做的,我们只是说object.executeInsert,这些非标准的SQL位被抽象给调用者。
  • @battlmonstr 见评论 ^^ 上面 ^^。然后,如果这是 Oracle12 并且您只使用 identity 怎么办?触发器得到更多维护。如果此代码需要通过应用程序(如 .NET)执行,请按照我上面所说的进行。抽象 SQL 调用,构建 sql 生成对象或仅使用实体框架。
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多