[英]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中,而这正是我所需要的。 谢谢大家的回答。
例:
$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 - 替换为您的列名称。
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.