MySQL, stored procedures, SIGNAL/RESIGNAL

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux