PDOのOracleドライバーがlastInsertid()を実装しないのはなぜですか?
-
27-10-2019 - |
質問
PDOでこのエラーが発生します:
メッセージ:メッセージ:pdo :: lastinsertid()[pdo.lastinsertid]:sqlstate [im001]:ドライバーはこの機能をサポートしていません:ドライバーはlastinsertid()をサポートしません
Oracleデータベースから最後に挿入されたIDを取得しようとするとき。最後の挿入ID関数にシーケンス文字列を追加しましたが、まだ機能していません。 Googleは、PDOを使用したOracleでのこのエラーについてはあまり語っていません。
解決
OracleにはAutoincrement列がないため、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を使用しないでください。それを呼び出すときはいつでも、次の値に値を増加させます。その目的のために通貨を使用する必要があります. 。以下は例です:
$sh = $conn->prepare("SELECT SEQUENCE_NAME.CURRVAL AS lastInsertId FROM DUAL");
$lastInserId = $sh->execute();
デバッグ: print_r($lastInserId);
所属していません StackOverflow