IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Procedure stockee select * ...


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut Procedure stockee select * ...
    Bonjour à tous,
    j'ai un probleme sans doute banal mais je n'ai pas réussi à le résoudre ...

    je fais un site en php5, je veux simplement réaliser un select * from ... grace à une procedure qui me renvoie les valeurs des enregistrements sous forme de tableau. Je cree un type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     create or replace package types is 
        type cursorType is ref cursor; 
    end; 
    /

    et je cree ma procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     create or replace procedure select_users
    as
    type cursorType is ref cursor;
    mycur cursorType;
    begin
    open mycur for select * from users;
    end;
    /
    en php, j'execute ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     BEGIN select_commands;END;
    mais ça ne me retourne rien, comment faire ?
    merci !

  2. #2
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    select_users
    ...
    en php, j'execute ceci
    BEGIN select_commands;END;
    Déjà les noms ne sont pas les mêmes. Ensuite quand vous dites
    mais ça ne me retourne rien
    qu'attendiez-vous ?
    et
    comment faire ?
    Faire quoi ? Que cherchez vous à faire exactement ? Si c'est à AFFICHER le contenu de votre curseur vous n'en avez pas parlé et je ne vois nulle part un quelconque code qui permettrait de l'afficher.

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut
    Pour les noms, c'est une erreur de recopie .. !


    Je souhaite en effet afficher le contenu de mon curseur, dois je utiliser une fonction qui me retourne celui ci ?
    En gros, je souhaite recuperer un enregistrement select * from users where id=1 afin d'affecter ensuite chaque valeur de champ à mes variables php

  4. #4
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Citation Envoyé par chacha81
    Je souhaite en effet afficher le contenu de mon curseur, dois je utiliser une fonction qui me retourne celui ci ?
    Je n'y connais rien en PHP mais je suis quasiment sûr que oui. Il faut effectivement récupérer le contenu du cursor comme un objet PHP que vous serez capable de lire et de manipuler à votre aise en utilisant les fonctions PHP. Et donc d'affecter vos variables.


    Voila ce que je trouve sur PHP :
    Lire le résultat d'une requête

    Il faut utiliser conjointement 2 fonctions : OCIFetch et OCIResult. OCIFetch permet de récupérer une ligne du résultat, alors que OCIResult permet de lire une valeur d'une ligne récupérée par OCIFetch. Dans l'exemple suivant, on va interroger la table articles contenant les colonnes article et prix :

    $stmt = OCIParse($connexion, "SELECT * FROM articles WHERE prix<=100");
    OCIExecute($stmt);
    $compteur = 0;
    while (OCIFetch($stmt)) {
    $compteur++;
    echo OCIResult($stmt, "ARTICLE")." coûte ";
    echo OCIResult($stmt, "PRIX")." F<BR>\n";
    }
    OCIFreeStatement($stmt);
    echo "$compteur articles trouvés.";

    Même si la requéte ne renvoie qu'une seule ligne (cas d'un "SELECT COUNT(*)" par exemple), il est indispensable de faire un OCIFetch pour récupérer le résultat. Exemple :

    $query = "SELECT COUNT(*) total FROM articles WHERE prix<=100";
    $stmt = OCIParse($connexion, $query);
    OCIExecute($stmt);
    OCIFetch($stmt);
    echo OCIResult($stmt, "TOTAL")." articles à moins de 100 F.";
    OCIFreeStatement($stmt);

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut
    mon probleme se situe deja coté Oracle car coté php, ça peut aller !
    a present j'ai ceci :

    create or REPLACE FUNCTION select_users RETURN types.cursortyp IS
    cur types.cursortyp;
    BEGIN

    OPEN cur FOR SELECT * FROM users;
    RETURN cur;
    CLOSE cur;

    END;
    /

    il me cree la procedure mais lorsque je veux l'appeler, ça ne marche pas.
    select select_users() from dual;

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    merci d'éditer votre message pour ajouter les balises CODE

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    en 9.2.0.6, ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    SQL> select * from v$version;
    BANNER                                                                          
    ----------------------------------------------------------------                
    Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production                
    PL/SQL Release 9.2.0.6.0 - Production                                           
    CORE 9.2.0.6.0 Production                                                       
    TNS for HPUX: Version 9.2.0.6.0 - Production                                    
    NLSRTL Version 9.2.0.6.0 - Production                                           
    SQL> 
    SQL> desc t12;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     COL1                                               NUMBER(38)
     COL2                                               NUMBER(38)
    SQL> 
    SQL> create or replace package types is
      2    type cursorType is ref cursor;
      3  end;
      4  /
    Package created.
    SQL> show errors
    No errors.
    SQL> create or REPLACE FUNCTION select_t12 RETURN types.cursortype IS
      2  cur types.cursortype;
      3  BEGIN
      4  OPEN cur FOR SELECT * FROM t12;
      5  RETURN cur;
      6  CLOSE cur;
      7  END;
      8  /
    Function created.
    SQL> show errors
    No errors.
    SQL> select select_t12 from dual;
    SELECT_T12                                                                      
    --------------------                                                            
    CURSOR STATEMENT : 1                                                            
    CURSOR STATEMENT : 1
          COL1       COL2                                                           
    ---------- ----------                                                           
             1          2                                                           
            20         12                                                           
     
    SQL> exit

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut ok
    Merci pour votre réponse, j'ai donc bien la même chose mais par contre je suis en version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Oracle8i Enterprise Edition Release 8.1.7.4.1 - Production
     
    PL/SQL Release 8.1.7.4.0 - Production
    cela ne marche donc apparemment pas... puisque je crée mon package ainsi que ma fonction mais lors de l'appel de celle-ci : aucun retour !

    Si quelqu'un a une autre solution, je suis preneuse !

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Par défaut solution
    Voila, j'ai fini par trouver un code qui marche pour toutes les versions oracle (normalement!) !




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
     create or replace package pkg_select is
      type curseur is ref cursor;
      PROCEDURE  select_users(
        p_curseur OUT curseur);
       end;
       /
    create or replace   PACKAGE BODY pkg_select IS
    procedure select_users(
                              p_curseur OUT curseur)
    is
    begin
    open p_curseur for select * from users;
    end;
    end pkg_select;
    /
    COTE PHP5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $proc =  "BEGIN pkg_select.select_users(:r);END;";
    $prepareQuery = oci_parse($this->conn, $proc);
    $curseur = oci_new_cursor($this->conn);
    oci_bind_by_name($prepareQuery,":r",$curseur,-1,OCI_B_CURSOR);
    $ok = oci_execute($prepareQuery,OCI_DEFAULT);
    $ok = oci_execute($curseur,OCI_DEFAULT);
    $res = oci_fetch_array($curseur,OCI_ASSOC + OCI_RETURN_NULLS);
     return $res;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/11/2009, 20h48
  2. Réponses: 5
    Dernier message: 15/03/2007, 13h48
  3. [sgbd] Probleme DBI, procedure stockée de type "SELECT"
    Par tony le chicon dans le forum SGBD
    Réponses: 1
    Dernier message: 07/12/2006, 10h50
  4. [C#] Comment appeler une procédure stockée avec multiple SELECT ?
    Par Piolet dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/06/2006, 16h04
  5. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo