PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment une Postgres RAISE EXCEPTION est-elle convertie en PDOException ?

Utilisez le code propriété de PDOException pour obtenir le SQLSTATE . Voir la documentation pour PDOException

Pour contrôler le SQLSTATE généré par une fonction PL/PgSQL générant une erreur, vous utilisez RAISE ... SQLSTATE selon la documentation .

Bien sûr, pour que cela fonctionne, le pilote de base de données doit correctement signaler SQLSTATE . J'ai vérifié que PDO le fait au moins dans PHP 5.4.11 avec PostgreSQL 9.2, selon l'exemple de code autonome suivant qui peut être exécuté avec le php exécutable en ligne de commande :

<?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 sortie est :

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

Remplacez le bloc de code du deuxième $sth->execute() à la fin du code avec ceci pour démontrer que le mode de gestion des exceptions fonctionne bien aussi :

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