PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để chuyển đổi ngoại lệ RAISE của Postgres thành PDOException?

Sử dụng mã code thuộc tính của PDOException để lấy SQLSTATE . Xem tài liệu cho PDOException

Để kiểm soát SQLSTATE được tạo bởi một hàm PL / PgSQL gây ra lỗi, bạn sử dụng RAISE ... SQLSTATE theo tài liệu .

Tất nhiên, để điều này hoạt động, trình điều khiển cơ sở dữ liệu phải báo cáo chính xác SQLSTATE . Tôi đã xác minh rằng PDO thực hiện điều này ít nhất trong PHP 5.4.11 với PostgreSQL 9.2, theo mã ví dụ độc lập sau có thể được thực thi với php dòng lệnh có thể thực thi:

<?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());
}
?>

Đầu ra là:

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

Thay thế khối mã từ $sth->execute() thứ hai vào cuối mã với điều này để chứng minh rằng chế độ xử lý ngoại lệ cũng hoạt động tốt:

$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. Trả về mảng năm theo phạm vi năm

  2. postgres trong vagrant (ubuntu14.04)

  3. Tổng quan về các phương thức JOIN trong PostgreSQL

  4. Cách tạm dừng việc thực thi một câu lệnh trong PostgreSQL

  5. Không thể hoàn thành di chuyển bình