如何将Postgres“RAISE EXCEPTION”转换为PDOException?

时间:2013-03-14 23:17:56

标签: php postgresql exception

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

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

我能管理的最好的是:

RAISE EXCEPTION USING message = '<a message>', ERRCODE = 'UE001'

在PHP方面给我的消息如下:

ERROR:  NUM:UE001, DETAILS:<a message>

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

您的评论将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

使用code的{​​{1}}属性获取PDOException。见the documentation for PDOException

要控制由引发错误的PL / PgSQL函数生成的SQLSTATE,请使用RAISE ... SQLSTATE as per the documentation

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

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()