这并不难。下面是一个带有IN 参数、OUT 参数和结果集的 MySQL 存储过程示例:
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 查询。否则您会收到“Commands out of sync”错误。
如果您使用 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() );