Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour voici un bout de code de mon contrôleur pour m'expliquer :
$sql = 'DECLARE nbCmd number(10); BEGIN nbCmd:=MAJ_CDE(1,2,3); END;';
$numCmd = $this->callProc($sql);
protected function callProc($sql) {
$registry = Zend_Registry::getInstance();
$config = $registry->get("config");
$db = Zend_Db::factory($config->db);
$res1 = 'vide';
$db->beginTransaction();
try {
$statement = $db->prepare($sql);
$statement->bindParam('nbCmd', $res1, SQLT_CHR, 32);
$statement->execute();
$db->commit();
} catch (Exception $e) {
$db->rollBack();
}
return $res1;
}
La fonction s'exécute bien mais j'aimerais récupérer la valeur de retour (nbCmd) sachant que je ne peux pas modifier cette fonction oracle, ni en créer une nouvelle.
Merci d'avance
Dernière modification par Fuggerbit (23-04-2009 12:08:49)
Hors ligne
Tu fais
$res1=$statement->fetchObject();
Hors ligne
hum... a priori, si tu n'as pas de return à la fin de ta procédure stockée, c'est grillé, tu ne peux pas récupérer la valeur (je suis un peu rouillé pour le PL/SQL d'Oracle, mais avec le PL/PGSQL de Postgres, ça marche comme ça en tout cas...).
A+, Philippe
Hors ligne
ziedb a écrit:
Tu fais
$res1=$statement->fetchObject();
Ca ne fonctionne pas...
Hors ligne
philippe a écrit:
hum... a priori, si tu n'as pas de return à la fin de ta procédure stockée, c'est grillé, tu ne peux pas récupérer la valeur (je suis un peu rouillé pour le PL/SQL d'Oracle, mais avec le PL/PGSQL de Postgres, ça marche comme ça en tout cas...).
A+, Philippe
EN fait c'est une fonction, et elle retourne bien un résultat, seulement comme elle fait des opérations sur la base, je ne peux pas la lancer en faisant select MAJ_CDE(1,2,3) from dual apparement.
Hors ligne
Pour postgres, pour récupérer les données de mes procédures stockées, je fais :
// calculate list of document to display $sql = "select * from my_proc_stock ( :id, :viewDateStart, :viewDateEnd)"; $params = array( ":id"=>$id, ":viewDateStart"=>$start, ":viewDateEnd"=>$end ); $res = $db->fetchAll($sql,$params);
Dans mon cas, la procédure stockée renvoie une liste de lignes d'un type défini ailleurs (my_proc_stock_resultType) :
CREATE OR REPLACE FUNCTION my_proc_stock ( idParam integer, dateStartParam date, dateEndParam date ) RETURNS setof my_proc_stock_resultType AS $$ DECLARE [....]
A+, Philippe
PS : c'est tjrs du postgres, je n'ai plus d'Oracle sous la main pour tester...
Hors ligne
Merci mais le select * from la fonction ne marche pas
Hors ligne
regarde ça
ça peut peut être t'aider
http://www.z-f.fr/forum/viewtopic.php?id=2423
A+JYT
Hors ligne
sekaijin a écrit:
regarde ça
ça peut peut être t'aider
http://www.z-f.fr/forum/viewtopic.php?id=2423
A+JYT
Merci, ce post était intéréssant en effet mais ici c'est une fonction oracle en fait et non une procedure avec in out, donc elle fait un return.
Il y a des chances que la solution soit encore plus simple...
habituellement je fais des select fonc() from dual, et c'est bon mais uniquement pour les fonctions sans modif de base, là apparemment ça ne marche pas du fait que cette fonction modifie la table.
Hors ligne
En fait pour être précis, je peux lancer la fonction dans un select et récupérer le résultat, mais le retour est toujours une erreur car je ne dois pas faire l'appel de cette manière.
Hors ligne
Donc en gros ma question est, y'a t il un moyen d'exécuter le code suivant :
DECLARE nbCmd number(10); BEGIN nbCmd:=MAJ_CDE(1,2,3); END;
et de récupérer nbCmd
Hors ligne
$data = array(1,2,3); $sql = 'DECLARE :nbCmd number(10); BEGIN nbCmd:=MAJ_CDE(?,?,?); END;'; $sql = $this->_db->quoteInto($sql,$data); $res= null; $statement = $this->_db->prepare($sql); $statement->bindParam(':nbCmd ', $res, PDO::PARAM_INT); $statement->execute();
j'utilise PDO si tu utilise un autre driver il te faut en tenir compte dans le bindParam
a+JYT
Dernière modification par sekaijin (23-04-2009 11:51:09)
Hors ligne
Merci, j'ai trouvé, au début je pensais devoir faire :
$sql = 'DECLARE :nbCmd number(10); BEGIN :nbCmd:=MAJ_CDE(?,?,?); END;';
ou
$sql = 'DECLARE :nbCmd number(10); BEGIN nbCmd:=MAJ_CDE(?,?,?); END;';
mais en fait c'est :
$sql = 'DECLARE nbCmd number(10); BEGIN :nbCmd:=MAJ_CDE(?,?,?); END;';
Et là c'est bon
En tout cas merci sekaijin tu m'as bien aidé.
Hors ligne
de rien le binding n'est pas toujours évident
A+JYT
Hors ligne
Pages: 1