Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'aimerais appeler une procédure stockée oracle et récupérer les inout.
Voici la procédure :
PROCEDURE duplication ( p_cod_mag IN NUMBER,
p_nom_mag IN VARCHAR,
p_cod_mag_dup IN NUMBER,
p_erreur IN OUT VARCHAR,
p_message IN OUT VARCHAR );
je sais appeler une procédure sans IN OUT mais pas avec, comment faire?
Sans in out je fais :
$registry = Zend_Registry::getInstance();
$config = $registry->get("config");
$db = Zend_Db::factory($config->db);
$db->query("call P\$TEST.test('A')");
Merci d'avance
Dernière modification par Fuggerbit (19-01-2009 18:40:30)
Hors ligne
Hello,
Très franchement, j'ai jamais utilisé. As-tu essayer le paramètre bind() ?
$registry = Zend_Registry::getInstance(); $config = $registry->get("config"); $db = Zend_Db::factory($config->db); $bind['var1'] = 1; $bind['var2'] = 'info'; $bind['var3'] = 1; $bind['var4'] = 'info'; $bind['var5'] = $variableDeRetour; $db->query("call duplication(:var1, :var2, :var3, :var4, :var5)", $bind); echo $variableDeRetour;
Bien sûr non testé
A+
Hors ligne
Apparemment, ça ne marche pas.
Les variables de retour ne sont pas renseignées.
Par contre la procédure est bien appelée.
Dernière modification par Fuggerbit (19-01-2009 11:11:24)
Hors ligne
voici ma méthode générique pour mon projet
protected function _callImcProc($procName, $params, $out=null) { $data = $params; $return = new stdClass(); $res = ''; if (isset($out)) { $sql = 'BEGIN PKG_IMC.' . $procName . '(?, :out); END;'; } else { $sql = 'BEGIN PKG_IMC.' . $procName . '(?); END;'; } $sql = $this->_db->quoteInto($sql,$data); $this->_db->beginTransaction(); try { $statement = $this->_db->prepare($sql); if (isset($out)) { $statement->bindParam(':out', $res, PDO::PARAM_STR, 32); } $statement->execute(); $this->_db->commit(); $return->success = true; if (isset($out)) { $return->$out = $res; } } catch (Exception $e) { $this->_db->rollBack(); $return->error = $e->getMessage(); $return->msg = $sql; $return->success = false; } return $return; }
dans mon projet toute les procédures sont dans le package PKG_IMC les procédure qui retourne une valeur n'en retourne qu'une qui est toujours en dernière position
j'utilise PDO et l'appel se fait ainsi
public function saveAccess($data) { return $this->_callImcProc('INSERT_ACCES', array($userID, $resourceID), 'a_id'); }
elle retourne un objet avec les membres suivant
success Boolean succès de l'appel
error String le message d'erreur en cas d'echec
msg String le SQL généré dans la tansaction en cas d'echec
$out Any si la procédure est appelé avec un out la valeur de retour
A+JYT
Hors ligne
Ok alors merci, voici ma méthode :
protected function callDuplication($params, $err, $msg) { $data = $params; $registry = Zend_Registry::getInstance(); $config = $registry->get("config"); $db = Zend_Db::factory($config->db); $return = new stdClass(); $res1 = ''; $res2 = ''; $sql = 'P\$DUPLICATION_MAG.duplication(?, :err, :msg); END;'; $sql = $db->quoteInto($sql,$data); $db->beginTransaction(); try { $statement = $db->prepare($sql); $statement->bindParam(':err', $res1, PDO::PARAM_STR, 32); $statement->bindParam(':msg', $res2, PDO::PARAM_STR, 32); $statement->execute(); $db->commit(); $return->success = true; $return->$err = $res1; $return->$msg = $res2; } catch (Exception $e) { $db->rollBack(); $return->err = $e->getMessage(); $return->msg = $sql; $return->success = false; } return $return; }
Le soucis est que j'obtiens l'erreur :
900 ORA-00900: instruction SQL non valide *P\$DUPLICATION_MAG.duplication(-1, 'TEST DUPLICATION', 644, :err, :msg); END;
Je suppose qu'il faut changer quelque chose pour oracle, mais quoi, je ne sais pas...
Hors ligne
Fuggerbit a écrit:
Ok alors merci, voici ma méthode :
Code:
protected function callDuplication($params, $err, $msg) { $data = $params; $registry = Zend_Registry::getInstance(); $config = $registry->get("config"); $db = Zend_Db::factory($config->db); $return = new stdClass(); $res1 = ''; $res2 = ''; $sql = 'P\$DUPLICATION_MAG.duplication(?, :err, :msg); END;'; $sql = $db->quoteInto($sql,$data); $db->beginTransaction(); try { $statement = $db->prepare($sql); $statement->bindParam(':err', $res1, PDO::PARAM_STR, 32); $statement->bindParam(':msg', $res2, PDO::PARAM_STR, 32); $statement->execute(); $db->commit(); $return->success = true; $return->$err = $res1; $return->$msg = $res2; } catch (Exception $e) { $db->rollBack(); $return->err = $e->getMessage(); $return->msg = $sql; $return->success = false; } return $return; }Le soucis est que j'obtiens l'erreur :
900 ORA-00900: instruction SQL non valide *P\$DUPLICATION_MAG.duplication(-1, 'TEST DUPLICATION', 644, :err, :msg); END;
Je suppose qu'il faut changer quelque chose pour oracle, mais quoi, je ne sais pas...
$sql = 'P\$DUPLICATION_MAG.duplication(?, :err, :msg); END;';
je suppose quelque chose comme
$sql = 'BEGIN P' . $DUPLICATION_MAG . '.duplication(?, :err, :msg); END;';
A+JYT
Hors ligne
En fait la persone qui a fait la proc a eu la bonne idée de mettre un package avec un $
donc le package est : P$DUPLICATION_MAG
donc en gros si je ne protège pas le caractère j'ai :
$sql = 'BEGIN P$DUPLICATION_MAG.duplication(?, :err, :msg); END;'; 6502 ORA-06502: PL/SQL : erreur numerique ou erreur sur une valeur: erreur de conversion des caracteres en chiffres ORA-06512: a ligne 1 *BEGIN P$DUPLICATION_MAG.duplication(-1, 'TEST DUPLICATION', 644, :err, :msg); END;
si je le protège :
$sql = 'BEGIN P\$DUPLICATION_MAG.duplication(?, :err, :msg); END;'; 6550 ORA-06550: Ligne 1, colonne 9 : PLS-00181: directive de preprocesseur '$DUPLICATION_MAG' non prise en charge BEGIN P\*$DUPLICATION_MAG.duplication(-1, 'TEST DUPLICATION', 644, :err, :msg); END;
J'ai essayé avec un call, ca ne fonctionne pas.
La seule chose qui me permet d'appeler la proc (sans récupérer le résultat c'est :
$bind['var1'] = -1; $bind['var2'] = 'TEST DUPLICATION'; $bind['var3'] = 644; $bind['var4'] = $erreur; $bind['var5'] = $message; $res = $db->query("call P\$DUPLICATION_MAG.duplication(:var1, :var2, :var3, :var4, :var5)",$bind);
Hors ligne
Hello,
C'est Oracle ou Pdo_Oci ?
Si c'est Oracle, il faut sans doute remplacer PDO::PARAM_STR par SQLT_CHR
A+
Hors ligne
mikaelkael a écrit:
Hello,
C'est Oracle ou Pdo_Oci ?
Si c'est Oracle, il faut sans doute remplacer PDO::PARAM_STR par SQLT_CHR
A+
Niquel ca marche, merci à vous deux
Hors ligne
Merci les mecs ! vous assurez !
Cela fonction bien
$data = array(); $sql = "BEGIN PROCEDURE(param1,param2,param3,:code_retour); END;"; $sql = $db->quoteInto($sql, $data); $db->beginTransaction(); $statement = $db->prepare($sql); $statement->bindParam(':code_retour', $code_retour, SQLT_CHR, 32); $statement->execute(); $db->commit(); var_dump($code_retour);
Dernière modification par Golden (22-01-2009 12:28:40)
Hors ligne
Pages: 1