PDOのOracleドライバーがlastInsertid()を実装しないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/9328980

質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top