2012-02-17 8 views
6

私はPDOでこのエラーを取得する:PDOのOracleドライバがlastInsertId()を実装しないのはなぜですか?

error: Message: PDO::lastInsertId() [pdo.lastinsertid]: SQLSTATE[IM001]: Driver does not support this function: driver does not support lastInsertId()

Oracleデータベースから最後に挿入IDを取得しようとしています。最後のinsert id関数にシーケンス文字列を追加しましたが、まだ動作しません。 Googleはこのエラーに関して、OracleとPDOをあまり関係ないと言っています。

+0

代わりにクエリで取得しようとしましたか? (オラクルにはその機能があると仮定して) –

答えて

10

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

この競合状態は安全ですか? (私はオラクルについて単なる奇妙なことがありません) –

+0

@Pekka - nopek - nopeでは、シーケンス番号は、Oracleサーバーの競合状態のリスクなしに発行され、NEXTVALのすべての要求に対してインクリメントされ発行されます... MySQLsの自動インクリメントと同様、テーブルレベルではなくシーケンスの私は誰かがそれ以外の方法で問題に遭遇したと思うので、根本的な何かの問題は、Oracleをデータベースとして壊してしまいます。しかし、このメソッドを使用してidカラムに "古い値"を格納するのを防ぐことは何もありません。 –

+0

私は、シーケンスの次の値をフェッチする必要があることを知り、挿入を発行して一種の醜いものにします。 Oracleは、Postgresの['' curval'/'nextval' /' lastval'](http://www.postgresql.org/docs/current/static/functions-sequence.html)関数をインラインで使用できますか? (好奇心からの質問) – Charles

関連する問題