Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-01-2009 16:10:29

Fuggerbit
Membre
Date d'inscription: 17-12-2008
Messages: 54

[Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

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 wink

Dernière modification par Fuggerbit (19-01-2009 18:40:30)

Hors ligne

 

#2 17-01-2009 21:38:49

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

Hello,

Très franchement, j'ai jamais utilisé. As-tu essayer le paramètre bind() ?

Code:

$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é wink

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 19-01-2009 09:59:40

Fuggerbit
Membre
Date d'inscription: 17-12-2008
Messages: 54

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

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

 

#4 19-01-2009 13:24:59

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

voici ma méthode générique pour mon projet

Code:

    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

Code:

    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

 

#5 19-01-2009 16:11:39

Fuggerbit
Membre
Date d'inscription: 17-12-2008
Messages: 54

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

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...

Hors ligne

 

#6 19-01-2009 17:19:18

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

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...

Code:

        $sql = 'P\$DUPLICATION_MAG.duplication(?, :err, :msg); END;';

je suppose quelque chose comme

Code:

        $sql = 'BEGIN P' . $DUPLICATION_MAG . '.duplication(?, :err, :msg); END;';

A+JYT

Hors ligne

 

#7 19-01-2009 17:48:34

Fuggerbit
Membre
Date d'inscription: 17-12-2008
Messages: 54

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

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 :

Code:

$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 :

Code:

$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 :

Code:

$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

 

#8 19-01-2009 17:56:48

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

Hello,

C'est Oracle ou Pdo_Oci ?

Si c'est Oracle, il faut sans doute remplacer PDO::PARAM_STR par SQLT_CHR

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#9 19-01-2009 18:39:43

Fuggerbit
Membre
Date d'inscription: 17-12-2008
Messages: 54

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

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 wink

Hors ligne

 

#10 22-01-2009 12:26:30

Golden
Nouveau membre
Lieu: St Georges de Reneins
Date d'inscription: 21-05-2007
Messages: 4
Site web

Re: [Résolu][ZEND DB 1.7] Appel procédure stockée oracle avec out

Merci les mecs ! vous assurez !

Cela fonction bien

Code:

$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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages