Els procediments emmagatzemats (stored procedures) poden tenir paràmetres d’entrada IN i paràmetres de sortida OUT.

Per a definir aquest procediment empraríem un codi SQL com ara aquest:
CREATE PROCEDURE `codic_envia_mail`(IN `S_PLANTILLA` VARCHAR(50), IN `I_USUARI` INT, IN `S_TIPUS` VARCHAR(5), IN `I_CODI` INT, IN `S_PARAM1` VARCHAR(50), IN `S_PARAM2` VARCHAR(50), IN `S_PARAM3` VARCHAR(50), OUT `I_MAILPK` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
Els paràmetres d’entrada són les dades que li passem al procediment, i els paràmetres de sortida són els que ens permeten recuperar amb una altra comanda SELECT les dades que ha preparat el procediment.
En la imatge superior es passen 7 paràmetres d’entrada i un de sortida @I_MAILPK.
A nivell de codi PHP i ZendDb cridaríem el procediment i recuperaríem la variable de sortida amb un codi similar a aquest:
$s_variable_de_sortida = '@I_MAILPK';
try {
$o_sel=dbHandler::getAdapter()
->query("CALL codic_envia_plantilla('{$s_plantilla}', {$i_usuari}, '{$s_tipus}', {$i_codi}, '{$s_parametre1}', '{$s_parametre2}', '{$s_parametre3}', {$s_variable_de_sortida})");
// Recuperar la variable de sortida. Pe: @I_MAILPK
$o_sel2=dbHandler::getAdapter()
->query("SELECT {$s_variable_de_sortida}");
// Nota: Encara millor si feu servir la substitució amb ? ja que llavors és ZendDb qui filtra possibles caracters problemàtics
$o_sql = "CALL codic_envia_plantilla(?, ?, ?, ?, ?, ?, ?, {$s_variable_de_sortida})";
$o_sel=dbHandler::getAdapter()
-->query($s_sql, array($s_plantilla, $i_usuari, $s_tipus, $i_codi, $s_parametre1, $s_parametre2, $s_parametre3));
// Recuperar la variable de sortida. Pe: @I_MAILPK
$o_sel2=dbHandler::getAdapter()
->query("SELECT {$s_variable_de_sortida}");
if ($o_sel2->rowCount() > 0){
$st_dades = $o_sel2->fetch();
$i_resultat = $st_dades[$s_variable_de_sortida];
return true; // S'ha executat bé, sortim de la funció retornant true
}
else
{
// El procediment no ha retornat cap valor dins la variable
// així que no ha anat bé
return false;
}
} catch (Exception $e) {
// Hi ha hagut una excepció (Exception)
throw new Exception('Excepció enviant el correu: '.$e->getMessage());
}
Els prefixes $s_ $i_ ens indiquen quin tipus de variable és:
$s_ string, cadena de caracters
$i_ integer, número sencer
$b_ boolean, valor booleà true/false >0 o 0/null/blanc
$st_ structure, estructura, com ara un array
$o_ object, objecte per exemple de base de dades
La variable de sortida a MySql porta l’ensaïmada o arrova davant.
Podem utilitzar altres notacions com $r_ per als arrays, etc.. però és important de cara a la llegibilitat del nostre codi sempre emprar la mateixa notació.
Emprar aquests prefixes ens estalviarà errors de programació, per exemple sumar cadenes amb números.
Un exemple de programació sense ZendDb i dos paràmetres de sortida:
mysql_query = "call sp_GetUsers('ProjectName',@ErrorNumber, @ErrorMessage)";
$result = mysql_query('select @ErrorNumber, @ErrorMessage');
$row = mysql_fetch_assoc($result);
print_r($row);
Com veieu sense indicar els prefixes resulta força menys intuitiu.
Per a més exemple de crides IN/OUT sense ZendDb podeu veure:
http://www.herongyang.com/jdbc/MySQL-CallableStatement-Procedure-Parameters.html
http://www.tek-tips.com/viewthread.cfm?qid=1441148&page=10