Это не так уж сложно. Вот пример хранимой процедуры MySQL с параметром IN
, параметром OUT
и набором результатов:
CREATE PROCEDURE MyProc(IN i INTEGER, OUT o INTEGER)
BEGIN
SELECT i+10 INTO o;
SELECT i, o;
END
Вы можете вызвать это с помощью метода query()
и передать параметр:
$stmt = $db->query("CALL MyProc(?, @output)", array(25));
print_r( $stmt->fetchAll() );
Хитрость заключается в том, что хранимые прокси MySQL могут возвращать несколько результирующих наборов (например, если у процесса было несколько SELECT
запросов). Поэтому API должен пройти через все наборы результатов, прежде чем вы сможете выполнить другой SQL-запрос. Или же вы получаете сообщение об ошибке " Команды из синхронизации ".
Если вы используете адаптер PDO_MySQL:
while ($stmt->nextRowset()) { }
Если вы используете адаптер MySQLi, вы обнаружите, что Zend_Db_Statement_Mysqli
не реализует nextRowset()
, поэтому вам нужно вызвать внутренний объект соединения mysqli:
while ($db->getConnection()->next_result()) { }
Как только вы очистите наборы результатов, вы можете запустить последующие запросы SQL, например, чтобы получить значение параметра OUT
процедуры:
$stmt = $db->query("SELECT @output");
print_r( $stmt->fetchAll() );