sql >> Database >  >> RDS >> PostgreSQL

Hoe wordt een Postgres RAISE EXCEPTION omgezet in een PDOException?

Gebruik de code eigendom van PDOException om de SQLSTATE . te krijgen . Zie de documentatie voor PDOException

De SQLSTATE besturen gegenereerd door een PL/PgSQL-functie die een fout veroorzaakt, gebruik je RAISE ... SQLSTATE volgens de documentatie .

Om dit te laten werken, moet het databasestuurprogramma natuurlijk SQLSTATE correct rapporteren . Ik heb geverifieerd dat PDO dit in ieder geval doet in PHP 5.4.11 met PostgreSQL 9.2, volgens de volgende standalone voorbeeldcode die kan worden uitgevoerd met de php uitvoerbaar opdrachtregelbestand:

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

Uitgang is:

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

Vervang het codeblok van de tweede $sth->execute() aan het einde van de code om aan te tonen dat de uitzonderingsbehandelingsmodus ook goed werkt:

$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. Hoe krijg ik UTF-8 werkend in Java-webapps?

  2. Hoe krijg ik tekstuele inhoud van BLOB in Oracle SQL?

  3. Hoe de combinatorische functie in postgres te schrijven?

  4. PHP sqlsrv_connect to SQL Server:er is een netwerkgerelateerde of instantiespecifieke fout opgetreden tijdens het tot stand brengen van een verbinding met SQL Server