【问题标题】:Multiple queries with oracle使用 oracle 进行多个查询
【发布时间】:2018-02-23 00:18:46
【问题描述】:

我想在 ORACLE 11g 版本中同时执行两个查询,并注意如果一个或两个查询失败,必须将两个表都返回到以前的状态。

在我的情况下,我需要进行更新并稍后插入另一个表,因此查询将大致如下:

$query="UPDATE table1 SET attr1 = ? WHERE whatever";
$stmt = $this->oracleDB->prepare($query);
$stmt->bindValue(1, $attr1, "string");
$stmt->execute();

$query="INSERT INTO table2 (attr2) VALUES (?)";
$stmt = $this->oracleDB->prepare($query);
$stmt->bindValue(1, $attr2, "string");
$stmt->execute();

我还使用绑定系统来更安全地发送变量。不确定是否会影响答案。

我不确定该过程是否是答案,如果是答案,那么在此示例中该过程将如何?

非常感谢。

【问题讨论】:

  • 第一个查询和第二个查询是什么关系?
  • 如果您有权对数据库进行更改,则可以将两个查询放在一个存储过程中,其中任何失败状态都会回滚任何成功的更改。
  • 这是标准交易。确保自动提交关闭,你做 DML。在任何异常情况下进行回滚。
  • 你们中的任何人都可以写出对过程的调用和我应该添加到数据库过程中的代码的外观吗?

标签: php oracle


【解决方案1】:

您可以使用匿名 PL/SQL 块来运行多个语句:

$query=" BEGIN UPDATE table1 SET attr1 = ? WHERE whatever;
          INSERT INTO table2 (attr2) VALUES (?);END; ";
$stmt = $this->oracleDB->prepare($query);
$stmt->bindValue(1, $attr1, "string");
$stmt->bindValue(2, $attr2, "string");
$stmt->execute();

可能存储过程更干净。

【讨论】:

  • 我猜第二个 prepare($query) 是没有必要的。
  • 再次打扰,但是...没有必要添加一个 SAVEPOINT nameSavePoint;以及回滚到保存点的异常代码?我从未使用过这个,但在这个页面中出现了这个概念:docs.oracle.com/cd/B19306_01/appdev.102/b14261/… 在你的例子中如果插入失败可以撤消以前的更新?
  • 我假设 oracleDB 对象具有启动/结束事务的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多