sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo se convierte una EXCEPCIÓN DE AUMENTO de Postgres en una excepción PDO?

Usa el code propiedad de PDOException para obtener el SQLSTATE . Consulte la documentación de PDOException

Para controlar el SQLSTATE generado por una función PL/PgSQL que genera un error, usa RAISE ... SQLSTATE según la documentación .

Por supuesto, para que esto funcione, el controlador de la base de datos debe informar correctamente SQLSTATE . He verificado que PDO hace esto al menos en PHP 5.4.11 con PostgreSQL 9.2, según el siguiente código de ejemplo independiente que se puede ejecutar con php ejecutable de línea de comandos:

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

La salida es:

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

Reemplace el bloque de código del segundo $sth->execute() hasta el final del código con esto para demostrar que el modo de manejo de excepciones también funciona bien:

$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");
}