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
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php