[Oracle][Résolu] Récupérer refcursor d'une function Oracle

Récupérer refcursor d'une function Oracle [Oracle][Résolu] - PHP - Programmation

Marsh Posté le 03-12-2010 à 16:12:08    

Bonjour,
 
J'essaye en ce moment de récupérer le refcursor qui est renvoyée par une de mes fonctions Oracle dans un script PHP. Mais sans succès jusqu'à maintenant. J'ai essayé plein de requêtes différentes, différentes instructions php, mais pour l'instant c'est toujours raté. :(
 
Je vous mets ci-dessous le code que j'utilise pour appeler ma function Oracle:
 

Code :
  1. <?
  2. public function update()
  3. {
  4.     $host     = Mage::getStoreConfig('service/fioul/host');
  5.     $dbname   = Mage::getStoreConfig('service/fioul/dbname');
  6.     $username = Mage::getStoreConfig('service/fioul/dbuser');
  7.     $password = Mage::getStoreConfig('service/fioul/dbpasswd');
  8.     $conn = oci_connect($username, $password, "$host/$dbname";);
  9.     if ($conn === false) {
  10.         $e = oci_error();
  11.         trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
  12.         Mage::throwException($e['message']);
  13.     }
  14. //       $sql = "SELECT WEB_CMD_DEV.GETTARIF() FROM dual";
  15. //       $sql = "BEGIN execute immediate 'SELECT WEB_CMD_DEV.GETTARIF FROM dual'; end;";
  16. //       $sql = "VARIABLE :rc REFCURSOR
  17. //               EXECUTE :rc := WEB_CMD_DEV.GetTarif;";
  18. //       $sql = "SELECT * FROM Cursor(WEB_CMD_DEV.GETTARIF())";
  19.        $sql = 'BEGIN :rc := WEB_CMD_DEV.GetTarif; END;';
  20.    $stid = oci_parse($conn, $sql);
  21.    $curs = oci_new_cursor($conn);
  22.    if(!$stid){
  23.        $e = oci_error();
  24.        trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
  25.        Mage::throwException($e['message']);
  26.    }
  27. //       oci_bind_by_name($stid, ":rc", $curs, -1, OCI_B_CURSOR);
  28.    $exec1 = oci_execute($stid);
  29. //       $exec2 = oci_execute($curs);
  30.    if(!$exec1){
  31.        $e = oci_error();
  32.        trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
  33.        Mage::throwException($e['message']);
  34.    }
  35. //       $res1 = oci_fetch_all($stid);
  36. //       var_dump($res1);
  37. //echo "<hr>n";
  38. //       $res2 = oci_fetch_all($curs);
  39. //       var_dump($res2);
  40.    echo "<table border='1'>n";
  41.    while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
  42.        echo "<tr>n";
  43.        foreach ($row as $item) {
  44.            //echo "<td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "";) . "</td>n";
  45.            echo "<td>" . print_r($item, true) . "</td>n";
  46.        }
  47.        echo "</tr>n";
  48.    }
  49.    echo "</table>n";
  50. }
  51. ?>


 
Vous auriez une idée de l'implémentation coté PHP ainsi que de la requête Oracle à utiliser?
Merci. :)


Message édité par c0wb0y le 03-12-2010 à 17:15:26
Reply

Marsh Posté le 03-12-2010 à 16:12:08   

Reply

Marsh Posté le 03-12-2010 à 16:52:32    

J'ai pas l'impression que ce soit utilisable coté php, ton ref_cursor...je connaissais même pas.[:joce]
C'est quoi le but du truc? :??:


Message édité par skeye le 03-12-2010 à 16:52:40

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 03-12-2010 à 17:08:32    

En fait je viens de réussir, j'en aurais perdu du temps sur ce truc! :o

 

Skeye: Bah en fait, on nous a fournit une BDD Oracle sur laquelle des fonctions ont été créé pour nous remonter automatiquement certaines informations. Le but de mon script et de contacter la base Oracle, appeler ces fonctions pour récupérer les données voulues. En gros ça nous évite de nous farcir l'étude de la BDD pour écrire les requêtes nous mêmes, d'autant que cette base Oracle, nous n'y auront pas accès en prod, là j'ai juste récupéré une copie pour pouvoir faire les dev.

 

Sinon pour info, voici le code qui fonctionne, la fonction appelée c'est GetTarif du package WEB_CMD_DEV:

 
Code :
  1. public function update()
  2.    {
  3.        $host     = Mage::getStoreConfig('service/fioul/host');
  4.        $dbname   = Mage::getStoreConfig('service/fioul/dbname');
  5.        $username = Mage::getStoreConfig('service/fioul/dbuser');
  6.        $password = Mage::getStoreConfig('service/fioul/dbpasswd');
  7.  
  8.        $conn = oci_connect($username, $password, "$host/$dbname";);
  9.  
  10.        if ($conn === false) {
  11.            $e = oci_error();
  12.            Mage::throwException(htmlentities($e['message'], ENT_QUOTES));
  13.        }
  14.  
  15.       $sql = 'BEGIN :rc := WEB_CMD_DEV.GetTarif; END;';
  16.  
  17.       $stid = oci_parse($conn, $sql);
  18.       if($stid === false){
  19.           $e = oci_error();
  20.           Mage::throwException(htmlentities($e['message'], ENT_QUOTES));
  21.       }
  22.  
  23.       $curs = oci_new_cursor($conn);
  24.       oci_bind_by_name($stid, ":rc", $curs, -1, OCI_B_CURSOR);
  25.  
  26.       if(oci_execute($stid) === false){
  27.           $e = oci_error();
  28.           Mage::throwException(htmlentities($e['message'], ENT_QUOTES));
  29.       }
  30.  
  31.       if(oci_execute($curs) === false){
  32.           $e = oci_error();
  33.           Mage::throwException(htmlentities($e['message'], ENT_QUOTES));
  34.       }
  35.  
  36.        $this->_showResultsTable($curs, 'oci');
  37.    }
 

( pour préciser, les données sont contenues dans la variable $curs, j'ai cachée le code de showResultsTable car il ne présente aucun intéret particulier, on parcours le curseur ligne par ligne avec la méthode oci_fetch_array($curs, OCI_ASSOC+OCI_RETURN_NULLS) et on accède aux données voulues dans le tableau associatif retourné par cette fonction ).


Message édité par c0wb0y le 03-12-2010 à 17:20:37
Reply

Marsh Posté le 03-12-2010 à 17:32:02    

Une chose à ajouter encore, avec PDO ça semble impossible d'implémenter ce genre de truc. Les Ref Cursor ne seraient pas (encore) géré par le driver PDO_OCI. (J'ai essayé de refaire un code équivalent avec PDO mais ça ne fonctionne pas).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed