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

PL/SQL Oracle Discussion :

Utiliser un ref cursor d'une autre procédure, avec un rowtype [10g]


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Points : 28
    Points
    28
    Par défaut Utiliser un ref cursor d'une autre procédure, avec un rowtype
    Bonjour,

    Je me demande si ce que je souhaite est possible, en tout cas, pas moyen d'être fixé.
    Voici ce que je veux faire :
    J'ai un package oracle (pkg_A) utilisé pour une appli web. J'ai un autre package oracle (pkg_B) utilisé pour une autre appli.
    En gros, sur le web, on commande, sur l'appli windows, on paramètre.
    Il y a une procédure stockée dans le pkg_A qui renvoie une liste d'article, une requête un peu compliquée qui renvoie plein de champs de plein de tables, sous forme de ref cursor.
    Dans le pkg_B, je voudrai appeler cette procédure et utiliser ce ref cursor.
    A priori, j'ai le droit, mais au moment de faire mon fetch, je voudrai un rowtype car la requête d'origine peut changer (nouveaux champs...) et moi, je veux seulement quelques champs qu'on ne supprimera pas.

    J'ai essayé un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type testtype is TABLE OF myCursor%rowtype;
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur: PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
    Ai-je un autre moyen que celui de déclarer tous les champs de mon ref cursor, et de devoir modifier cette procédure à chaque changement de mon curseur d'origine ??

    Merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Votre exemple est incomplet et risque d'être mal compris.
    En supposant que j'ai bien compris votre demande vous pouvez probablement ajouter dans le package A un curseur statique qui reprends la définition des colonnes ramenées par le curseur ouvert dans la procédure et définir par la suite un (sub)type ancré à ce curseur. Alternativement vous pouvez définir, dans le même package A, en mode explicite une structure de type record correspondante aux colonnes ramenées par le curseur.

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Merci pour la réponse

    Le package avec la procédure qui crée le ref cursor pourrait lui-même fournir le rowtype ?
    La procédure que je veux appeler fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open mycursor for select * from (select champs1, champs2(...) from table 1 inner join table2 on... where...) order by champs_1
    Dès lors, je ne vois pas comment créer un type (j'ai essayé rien que dans la procédure : refus), encore moins accessible depuis un autre package. Un record non plus.

    Et un cursor qui récupère les champs d'un ref cursor. Bien l'idée ! Mais euuuh, je ne vois pas comment faire

    Depuis le temps que je fais de l'oracle, jamais eu besoin de faire ce genre de manip
    A mon avis, cela va rester en fetch ref cursor into champs1, champs2.... comme j'ai fait pour dépanner en attendant mieux

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Voilà en gros à quoi j'avais pensé
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> 
    SQL> CREATE OR REPLACE Package Pk_refCrs
      2  Authid Definer Is
      3    -- Modèle de cursor
      4    Cursor crs_Emp Is
      5      Select e.empno,
      6             e.ename,
      7             e.job,
      8             e.sal
      9        from emp e;
     10    -- le type
     11    SubType Emp_Typ Is crs_Emp%rowType;
     12    --
     13    Procedure Get_Emps(crs In Out sys_refcursor);
     14  End;
     15  /
    Package created
     
    SQL> 
    SQL> CREATE OR REPLACE Package Body Pk_refCrs
      2  Is
      3    Procedure Get_Emps(crs In Out sys_refcursor)
      4    Is
      5    Begin
      6      Open crs For Select e.empno,
      7             e.ename,
      8             e.job,
      9             e.sal
     10        from emp e;
     11    End;
     12  End;
     13  /
    Package body created
     
    SQL> set serveroutput on
    SQL> 
    SQL> Declare
      2    r         Pk_refCrs.Emp_Typ;
      3    a_crs     sys_refcursor;
      4  Begin
      5    Pk_refCrs.Get_Emps(a_crs);
      6    Loop
      7      Fetch a_crs Into r;
      8      Exit When a_crs%NOTFOUND;
      9      dbms_output.put_line(r.empno||'-'||r.ename);
     10    End Loop;
     11  End;
     12  /
    7369-SMITH
    7499-ALLEN
    7521-WARD
    7566-JONES
    7654-MARTIN
    7698-BLAKE
    7782-CLARK
    7788-SCOTT
    7839-KING
    7844-TURNER
    7876-ADAMS
    7900-JAMES
    7902-FORD
    7934-MILLER
    PL/SQL procedure successfully completed
     
    SQL>

  5. #5
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Ok, je comprends l'idée, et cela fonctionne même avec un paramètre. Preuve que c'est réalisable !
    J'ai besoin d'une validation en interne pour pouvoir déclarer le curseur "en variable glogale" du package, mais je pense que ça va le faire
    Merci

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Sinon vous devez définir la structure du Record par vous même (dans le package A) et je pense que c'est cette solution à privilégier pour le code dédié à la production.

  7. #7
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Je prends note. J'avoue que je n'utilise jamais les records, même pas sûr qu'il y en ait un dans les 100000 lignes de PL/SQL !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2016, 14h27
  2. Appel une procédure d'une autre procédure
    Par 18mar dans le forum SQL
    Réponses: 16
    Dernier message: 31/05/2008, 11h39
  3. Réponses: 4
    Dernier message: 26/04/2007, 09h03
  4. Réponses: 3
    Dernier message: 02/02/2007, 14h30
  5. utilisation de fonction membre dans une autre
    Par tcharles dans le forum C++
    Réponses: 4
    Dernier message: 14/12/2005, 17h19

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