Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1925 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2039897
c0wb0y
:d
Posté le 03-12-2010 à 16:12:08  profilanswer
 

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
mood
Publicité
Posté le 03-12-2010 à 16:12:08  profilanswer
 

n°2039913
skeye
Posté le 03-12-2010 à 16:52:32  profilanswer
 

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 -
n°2039919
c0wb0y
:d
Posté le 03-12-2010 à 17:08:32  profilanswer
 

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
n°2039932
c0wb0y
:d
Posté le 03-12-2010 à 17:32:02  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
récupérer tout les élements d'un treerécupérer valeur avec $_post
format date sous oraclerécuperer l'adresse IP d'un client avec recvfrom
Deprecated: Function split() is deprecated in (suite maj php)sélecteur Jquery : récupérer une valeur
Récupérer toutes les instances d'ExcelProbleme taille de log oracle
[Oracle] Récupérer des informations sur les clés étrangères 
Plus de sujets relatifs à : [Oracle][Résolu] Récupérer refcursor d'une function Oracle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR