MySQL, stored procedures, SIGNAL/RESIGNAL
| From: | Marco Baumgartl | Date: | Thu, 27 Sep 2012 13:25:32 +0000 |
| Subject: | MySQL, stored procedures, SIGNAL/RESIGNAL | ||
| Groups: | php.db | ||
| Request: | Send a blank email to php-db+get-48548@lists.php.net to get a copy of this message | ||
Hi!
I'm currently developing an application which makes heave use of stored procedures, stored functions and MySQL's SIGNAL/RESIGNAL feature.
Everything works great if I call only one stored procedure.
But if I call a stored procedure which calls another stored procedure or function, SIGNALS from stored procedures are not available as exceptions in PHP.
---------------- doSth stored procedure ----------------
DELIMITER $$
USE signaltest$$
DROP PROCEDURE IF EXISTS doSth$$
CREATE PROCEDURE doSth()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RESIGNAL;
END;
SELECT signalSth();
SELECT 'something';
END$$
DELIMITER ;
---------------------------------------------------------
--------------- signalSth stored function ---------------
DELIMITER $$
USE signaltest$$
DROP FUNCTION IF EXISTS signalSth$$
CREATE FUNCTION signalSth() RETURNS BOOLEAN
BEGIN
SIGNAL SQLSTATE '45001';
RETURN TRUE;
END$$
DELIMITER ;
---------------------------------------------------------
<?php
$host = ''; $db = ''; $user = '';$password = ''; $dsn = sprintf('mysql:host=%s;dbname=%s', $host, $db); $conn = new \PDO($dsn, $user, $password); $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare('CALL doSth()'); try {
if (! $stmt->execute()) {
echo 'error: ' . PHP_EOL;
print_r($stmt->errorInfo());
print_r($stmt->errorCode());
}
echo 'ok: ' . PHP_EOL;
var_dump($stmt->fetchAll(\PDO::FETCH_ASSOC));
} catch (\PDOException $e) {
echo $e->getMessage() . PHP_EOL;} I expect the exception message to be printed to console: "Unhandled user-defined exception condition" instead "ok: array(0) { }" is printed. If I call the stored procedure through MySQL client, the SIGNAL is handled correctly: -------------------------------------------------------------- mysql> call doSth(); Empty set (0.00 sec) ERROR 1644 (45001): Unhandled user-defined exception condition -------------------------------------------------------------- Some version information: PHP: PHP 5.4.7-1~dotdeb.0 (cli) (built: Sep 15 2012 09:53:20) MySQL: 5.5.22-ndb-7.2.6-log mysqlnd => enabled Version => mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39 $ Compression => supported SSL => supported Command buffer size => 4096 Read buffer size => 32768 Read timeout => 31536000 Collecting statistics => Yes Collecting memory statistics => No Tracing => n/a Loaded plugins => mysqlnd,example,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password API Extensions => mysql,mysqli,pdo_mysql Am I doing anything wrong, is this feature not supported by the PHP driver or is it a bug? Regards, Marco