PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como um Postgres RAISE EXCEPTION é convertido em um PDOException?


Use o code propriedade de PDOException para obter o SQLSTATE . Consulte a documentação para PDOException

Para controlar o SQLSTATE gerado por uma função PL/PgSQL gerando um erro, você usa RAISE ... SQLSTATE conforme a documentação .

Obviamente, para que isso funcione, o driver do banco de dados deve informar corretamente SQLSTATE . Verifiquei que o PDO faz isso pelo menos no PHP 5.4.11 com PostgreSQL 9.2, de acordo com o seguinte código de exemplo autônomo que pode ser executado com o php executável de linha de comando:
<?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());
}
?>

A saída é:
Function call failed with SQLSTATE UE001, message ERROR:  error message

Substitua o bloco de código do segundo $sth->execute() para o final do código com isso para demonstrar que o modo de manipulação de exceção também funciona bem:
$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");
}