繁体   English   中英

使用 php 获取 oracle 中最后插入的 id

[英]Get last inserted id in oracle with php

我用这个创建了两个表:

CREATE TABLE t1 (id NUMBER GENERATED AS IDENTITY);
CREATE TABLE t2 (id NUMBER GENERATED AS IDENTITY);

我将一些数据插入到 t1 中,然后我需要将在该插入中生成的 ID 插入到 t2 中。

例如:

"insert into t1 (name, description) values ('asd','dsa')"
**getting that autogenerated ID
"insert into t2 (idFromt1,name) values (idFromt1,'sarasa')"

我看到很多例子在做:

"insert into t1 (name, description) values ('asd','dsa') returning ID into inserted_id";

但我不能/不知道如何从 php 中检索“inserted_id”变量以进行第二个插入。

您可以(应该吗?)使用returning值。

例如,使用PDO:

$query = "insert into t1 (name, description) values ('asd','dsa') returning ID";

$stmt = $pdo->query($query);

$id = $stmt->fetchColumn();

我正在搜索PDO并进入以下内容:

$qry="INSERT INTO t1 (NOMBRE) VALUES ('sarasa') returning ID into :inserted_id";

$parsed = oci_parse($this->conn, $qry);

oci_bind_by_name($parsed, ":inserted_id", $idNumber,32);
oci_execute($parsed);
echo $idNumber;

所以我假设oci_bind_by_name仅是一个方向,但不是。 这会将生成的ID保存到变量$ idNumber中,而这正是我所需要的。 谢谢大家的回答。

使用PDO :: lastInsertID

例:

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();

不要使用

SELECT MAX(id) FROM table;

因为如果在select之前执行一些其他插入查询是不安全的,那么它将不适用于事务。

这些答案对我来说都没有用——我一直把 NULL 作为我最后插入的身份。 偶然(字面上尝试一切)我发现在你做之前:

$stmt->bindParam('idfoo', $idfoo, PDO::PARAM_INT, 8);

您需要将 $idfoo 设置为 integer。我不知道为什么。 像这样:

$idfoo = (int)null;

它可以是任何 integer 但这对我来说更清楚,我只是将它“初始化”为某种类型的空值。

完整示例:

$query = "insert into t2 (name, description) values (:name, :description) returning ID into :idfoo";
$stmt = $connection->prepare($query);  

$name = 'adsjim';
$description = 'lead dev';

$params = array('name'=>$name, 'description'=>$description);
foreach ($params as $key=>$value){
      $stmt->bindValue($key,$value);
}
$idfoo = (int)null;
$stmt->bindParam('idfoo', $idfoo, PDO::PARAM_INT, 8);

$stmt->execute();
// insert id is now in the $idfoo variable
var_dump($idfoo);

标识列在数据库中的字面意思是 ID - 替换为您的列名称。

使用PDO::lastInsertId

SELECT MAX(id) FROM table;

这个问题是关于 PHP 使用 PDO 和 Oracle。 这些解决方案都不适合我,Emepese 的答案使用本机 OCI 驱动程序而不是 PDO,并且PDO::lastInsertId不适用于 Oracle。

Cid 的回答让我最接近,以及如何使用 php 在 oracle 11g xe 中获取最后插入记录的序列 ID的答案

但我的情况有点复杂。 我已经有了$stmt->prepare($query)$stmt->execute(array('name'=>$name, 'desc'=>$desc)); 为了使它工作,我写了这个:

$query = "insert into t1 (name, desc) values (:name, :desc) returning ID into :PK_ID";
// move params to an array:
$params = array('name'=>$name, 'desc'=>$desc);
foreach ($params as $key=>$value){
      $stmt->bindValue($key,$value);
}
$stmt->bindParam('PK_ID',$id,PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,32);
// Important! Remove all parameters from the execute command:
$stmt->execute();
// insert id is now in the $id variable - do something with it
echo "I inserted $id!";

我希望这有助于其他人在尝试使用身份列、Oracle 序列和绑定参数时节省数小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM