为什么PDO的Oracle驱动程序不实现lastInsertId()?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么PDO的Oracle驱动程序不实现lastInsertId()?相关的知识,希望对你有一定的参考价值。

我在PDO中收到此错误:

错误:消息:PDO :: lastInsertId()[pdo.lastinsertid]:SQLSTATE [IM001]:驱动程序不支持此功能:驱动程序不支持lastInsertId()

当试图从oracle数据库中获取最后一个插入的id时。我将序列字符串添加到最后一个插入ID函数但仍然不起作用。 Google对于使用PDO的Oracle上的此错误并未说太多。

答案

Oracle没有自动增量列,因此不支持lastInsertId与mysql相同。您必须使用Oracle序列“手动”实现等效。

为每个需要它的表创建一个oracle序列,并在需要进行插入时使用NEXTVAL检索它,然后在插入表时使用该值。

$sh = $conn->prepare('SELECT uid_seq.NEXTVAL AS nextInsertID FROM DUAL');
$sh->execute();
$nextInsertId = $sh->fetchColumn(0);

$sh = $conn->prepare("INSERT INTO table (id, data) VALUES(?, 255)");
$sh->execute(array($nextInsertId));
另一答案

在Oracle中,您应该为表创建一个oracle序列,这需要一个自动增量列。

如果你想插入,那么你可以在同一时间内完成,而不是查询nextIncrementId并插入如下:

$sh = $conn->prepare("INSERT INTO table (id, data) VALUES(SEQUENCE_NAME.NEXTVAL, ?)");
$sh->execute(array($valueToBeInsertedInDataColumn));

如果您只想知道最后一个插入ID,那么不要使用nextval,因为无论何时调用它,它都会将值递增到下一个。您应该使用CURRVAL来实现此目的。以下是一个例子:

$sh = $conn->prepare("SELECT SEQUENCE_NAME.CURRVAL AS lastInsertId FROM DUAL");
$lastInserId = $sh->execute();

调试:print_r($lastInserId);

以上是关于为什么PDO的Oracle驱动程序不实现lastInsertId()?的主要内容,如果未能解决你的问题,请参考以下文章

php中Oracle的程序与PDO

PDO抽象层访问

PDO_OCI:找不到驱动程序

将 PDO 与 Oracle 数据库连接

甲骨文,PDO_OCI 与 OCI8

PDO