6

我在 PDO 中收到此错误:

错误:消息:PDO::lastInsertId() [pdo.lastinsertid]: SQLSTATE[IM001]: Driver does not support this function: driver does not support lastInsertId()

当试图从 oracle 数据库中获取最后插入的 id 时。我将序列字符串添加到最后一个插入 id 函数但仍然无法正常工作。对于带有 PDO 的 Oracle 上的这个错误,谷歌并没有多说。

4

2 回答 2

12

Oracle 没有自动增量列,因此不像 MySQL 那样支持 lastInsertId。您必须使用 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));
于 2012-02-17T13:50:12.037 回答
0

在 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);

于 2018-07-13T06:39:26.053 回答