我试图弄清楚“RAISE EXCEPTION”语句的哪些“部分”被映射到PDOException的哪些“部分”。有人可以解释“谁”和“如何”执行此转换(或者更好的是,指向描述此代码的文档或执行此操作的源代码)?
更具体地说,我想知道是否有办法影响SQLSTATUS值(在我的测试中总是'P0001')和/或'ERROR:'值(它是消息的一部分并且始终为空)
我能管理的最好的是:
RAISE EXCEPTION USING message = '<a message>', ERRCODE = 'UE001'
在PHP方面给我的消息如下:
ERROR: NUM:UE001, DETAILS:<a message>
但我对此并不满意。能够将“UE001”“放入”PDOException字段之一(因此我不必将其从消息字符串中解析出来)会很棒。
您的评论将受到高度赞赏。
答案 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()