sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan konverteres en Postgres RAISE EXCEPTION til en PDOException?

Brug code egenskaben for PDOException for at få SQLSTATE . Se dokumentationen for PDOException

For at styre SQLSTATE genereret af en PL/PgSQL-funktion, der giver en fejl, bruger du RAISE ... SQLSTATE i henhold til dokumentationen .

For at dette skal virke, skal databasedriveren naturligvis rapportere SQLSTATE korrekt . Jeg har bekræftet, at PDO gør dette i det mindste i PHP 5.4.11 med PostgreSQL 9.2, ifølge følgende enkeltstående eksempelkode, der kan udføres med php kommandolinje eksekverbar:

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

Output er:

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

Erstat kodeblokken fra den anden $sth->execute() til slutningen af ​​koden med dette for at demonstrere, at undtagelseshåndteringstilstanden også fungerer fint:

$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. Oracle til MySQL tidsstempelkonvertering i MySQL indsæt sætning

  2. Microsoft annoncerer SQL Server 2012 R2 og SQL Server 2012 R3!

  3. indsættelse af værdier fra flere valgte afkrydsningsfelter i databasen

  4. postgres - FEJL:operatør eksisterer ikke