PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana Postgres RAISE EXCEPTION diubah menjadi PDOException?

Gunakan code properti PDOException untuk mendapatkan SQLSTATE . Lihat dokumentasi untuk PDOException

Untuk mengontrol SQLSTATE dihasilkan oleh fungsi PL/PgSQL yang menimbulkan kesalahan, Anda menggunakan RAISE ... SQLSTATE sesuai dokumentasi .

Tentu saja, agar ini berfungsi, driver database harus melaporkan dengan benar SQLSTATE . Saya telah memverifikasi bahwa PDO melakukan ini setidaknya dalam PHP 5.4.11 dengan PostgreSQL 9.2, per kode contoh mandiri berikut yang dapat dijalankan dengan php baris perintah yang dapat dieksekusi:

<?php
$pdo = new PDO('pgsql:');

$sql = <<<EOD
CREATE OR REPLACE FUNCTION exceptiondemo() RETURNS void AS $$
BEGIN
  RAISE SQLSTATE 'UE001' USING MESSAGE = 'error message';
END;
$$ LANGUAGE plpgsql
EOD;

$sth = $pdo->prepare($sql);
if (!$sth->execute()) {
        die("Failed to create test function\n");
}

$sql = "SELECT exceptiondemo();";

$sth = $pdo->prepare($sql);
if (!$sth->execute()) {
        $ei = $sth->errorInfo();
        die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");

        // Shortcut way:
        // die("Function call failed with SQLSTATE " . $sth->errorCode());
}
?>

Keluarannya adalah:

Function call failed with SQLSTATE UE001, message ERROR:  error message

Ganti blok kode dari $sth->execute() second kedua ke akhir kode dengan ini untuk menunjukkan bahwa mode penanganan pengecualian juga berfungsi dengan baik:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
        $sth->execute();
} catch (PDOException $err) {
        $ei = $err->errorInfo;
        die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");

        // Alternate version to just get code:
        //die("Function call failed with SQLSTATE " . $err->getCode() . "\n");
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Batas waktu pada kunci penasehat di postgresql

  2. Rails + Postgres drop error:database sedang diakses oleh pengguna lain

  3. Bagaimana cara memperbaiki skrip Automated Backup untuk postgres [Window]?

  4. Batasan pada perubahan skema PostgreSQL di dalam transaksi?

  5. Mengapa pernyataan ActiveRecord ini gagal di Server tetapi tidak di Konsol