0

我试图弄清楚“RAISE EXCEPTION”语句的哪些“部分”映射到 PDOException 的哪些“部分”。有人可以解释“谁”和“如何”执行此转换(或者更好的是,指向描述此转换的文档或执行此转换的源代码)?

更具体地说,我想知道是否有办法影响 SQLSTATUS 值(在我的测试中它总是'P0001')和/或'ERROR:'值(它是消息的一部分并且总是空的)

我能做到的最好的是:

使用消息引发异常 = '<a message>',ERRCODE = 'UE001'

在 PHP 方面,它给了我这样的消息:

错误:编号:UE001,详细信息:<一条消息>

但我对此不是很满意。能够将“UE001”“放入”PDOException 字段之一会很棒(因此我不必从消息字符串中解析它)。

您的评论将不胜感激。

4

1 回答 1

4

使用 的code属性PDOException来获取SQLSTATE. 请参阅文档PDOException

要控制SQLSTATE由引发错误的 PL/PgSQL 函数生成,请RAISE ... SQLSTATE按照文档使用。

当然,为此,数据库驱动程序必须正确报告SQLSTATE. 我已经验证 PDO 至少在 PHP 5.4.11 和 PostgreSQL 9.2 中执行此操作,根据以下可以使用php命令行可执行文件执行的独立示例代码:

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

输出是:

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

用这个替换从第二个$sth->execute()到最后的代码块,以证明异常处理模式也可以正常工作:

$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");
}
于 2013-03-14T23:46:55.073 回答