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 :

Convertir Tables reçues d'une PS vers un Ref Cursor ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Par défaut Convertir Tables reçues d'une PS vers un Ref Cursor ?
    Bonjour,

    Voici mon problème : j'ai un package, contenant une PS, qui renvoie entre autres 2 tables de char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	PROCEDURE ps_getListe(
    		TYPE_LIST				IN char,
     
    		NB_ITEMS				OUT INTEGER,
    		CODES				OUT CODES_tbl,
    		LIBS					OUT LIBS_tbl
    	);
    Mes types CODE_tbl et LIBS_tbl sont définis au niveau du schéma, comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TYPE CODES_tbl		AS TABLE OF char(4);
    TYPE LIBS_tbl		AS TABLE OF char(50);
    Seulement, .Net ne peut apparemment pas travailler directement sur des tables qui sont renvoyées en OUT d'une procédure. Je créée donc une fonction supérieure, qui récupérera le contenu de ma procédure, et le transformera en REF CURSOR (en tous cas, c'est ce que je voudrais faire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	TYPE lRefCursor is REF CURSOR;
     
    	FUNCTION fc_getListeDotNet(
    		TYPE_LIST				IN char,
    	) RETURN lRefCursor;
    C'est possible, ce genre de choses ?
    Malheureusement, je suis oblige de suivre ce process de fonction et de sous procédure pour différentes raisons internes, inévitables et inexplicables ici.

    Merci d'avance pour votre aide !
    Olif.

  2. #2
    Expert confirmé 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
    Par défaut
    C'est possible, par contre je ne suis pas convaincu que c'est une bonne idée.

    [Edit]
    Ah j’avais oublié, c’est quoi le « PS » : le parti socialiste, le play station, la procédure stockée, la procédure synchronisée ou la procédure stupide ?
    [/Edit]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Par défaut
    Possible, c'est un bon début, mais comment ?
    Je suis bien conscient que ce n'est surement pas le meilleur moyen, mais j'ai actuellement des contraintes spécifiques qui m'imposent ces méthodes.
    Sinon, quel(s) moyen(s) proposerais-tu, que je voie si ca peut coller ?

    Pour le PS, c'est une procédure stockée, ton intuition était la bonne (à ma décharge, vu le contexte, ca me semblait assez logique, non ?)

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par Olif_C Voir le message
    Seulement, .Net ne peut apparemment pas travailler directement sur des tables qui sont renvoyées en OUT d'une procédure.
    Je ne connais pas .Net mais le lien suivant semble contenir un exemple de ce que tu essaie de faire :
    http://forums.oracle.com/forums/thre...93435&tstart=0

    Dis-nous déjà si ça peut marcher ou si l'encapsulation est nécessaire.

  5. #5
    Expert confirmé 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
    Par défaut
    Voilà un example bidon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create or replace function foo return sys_refcursor Is
      l_var sys.odcivarchar2list := sys.odcivarchar2list();
      l_crs sys_refcursor;
    Begin
      l_var.extend(3);
      l_var(1) := 'un';
      l_var(2) := 'deux';
      l_var(3) := 'trois';
      --
      open l_crs for select column_value from table(l_var);
      return l_crs;
    End;
    Et le test:
    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
     
    SQL*Plus: Release 10.2.0.4.0 - Production on Mer. Juin 29 16:03:12 2011
     
    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
     
     
    Connecté à :
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> variable rc refcursor
    SQL> set autoprint on
    SQL> exec :rc := foo
     
    Procédure PL/SQL terminée avec succès.
     
     
    COLUMN_VALUE
    --------------------------------------------------------------------------------
    un
    deux
    trois
     
    SQL>
    Le PS n'est pas une abréviation habituelle sur ce forum. Mes réponses ne doivent pas dépendre de mes intuitions mais des vos énonces assez claires concernant votre question.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Je ne connais pas .Net mais le lien suivant semble contenir un exemple de ce que tu essaie de faire :
    http://forums.oracle.com/forums/thre...93435&tstart=0

    Dis-nous déjà si ça peut marcher ou si l'encapsulation est nécessaire.
    Merci pour cette piste, mais cette solution passe par le connecteur Oracle du framework .Net, et j'utilise le connecteur ODBC. Inapplicable dans mon cas, malheureusement.

    Mnitu, j’étais parti sur cette solution la, à un détail près : la PS me retourne 2 tables distinctes, que je dois donc renvoyer dans le Ref cursor de sortie. Pour résumer, ça ressemblerait plutôt à ceci :
    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
     
    CREATE OR REPLACE FUNCTION foo RETURN sys_refcursor IS
      l_var sys.odcivarchar2list := sys.odcivarchar2list();
      l_var2 sys.odcivarchar2list := sys.odcivarchar2list();
      l_crs sys_refcursor;
    Begin
      l_var.extend(3);
      l_var(1) := 'un';
      l_var(2) := 'deux';
      l_var(3) := 'trois';
      l_var2.extend(3);
      l_var2(1) := '1';
      l_var2(2) := '2';
      l_var2(3) := '3';
      --
      open l_crs FOR SELECT column_value FROM TABLE(l_var);
      RETURN l_crs;
    End;
    Et, dans le open du curseur, je dois récupérer ligne à ligne le contenu de chacune de mes tables, sous une forme qui ressemblerait, à peu pres, à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    COLUMN_VALUE        COLUMN2_VALUE
    --------------------------------------------------------------------------------
    un                          1
    deux                       2
    trois                        3

  7. #7
    Expert confirmé 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
    Par défaut
    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
    69
    70
    71
     
    ConnectÚ Ó :
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    mni@DIANA> Create Or Replace Type deux_col_typ As Object (
      2    col1     varchar2(10),
      3    col2  Varchar2(10)
      4  )
      5  /
     
    Type crÚÚ.
     
    mni@DIANA> Create Or Replace Type deux_col_nt As Table Of deux_col_typ
      2  /
     
    Type crÚÚ.
     
    mni@DIANA> CREATE OR REPLACE FUNCTION foo RETURN sys_refcursor IS
      2    l_var1 sys.odcivarchar2list;
      3    l_var2 sys.odcivarchar2list;
      4    l_deux_col  deux_col_nt := deux_col_nt();
      5    l_crs sys_refcursor;
      6    --
      7    Procedure init_2_tab (
      8       tab1_o              Out  sys.odcivarchar2list,
      9       tab2_o              Out  sys.odcivarchar2list
     10    ) Is
     11    Begin
     12      tab1_o := sys.odcivarchar2list();
     13      tab1_o.extend(3);
     14      tab1_o(1) := 'un';
     15      tab1_o(2) := 'deux';
     16      tab1_o(3) := 'trois';
     17      tab2_o := sys.odcivarchar2list();
     18      tab2_o.extend(3);
     19      tab2_o(1) := '1';
     20      tab2_o(2) := '2';
     21      tab2_o(3) := '3';
     22    End;
     23    --
     24  Begin
     25    -- proc qui renvoie les deux tableaux
     26    init_2_tab(l_var1, l_var2);
     27    --
     28    For i In 1..l_var1.Count() Loop
     29       l_deux_col.extend;
     30       l_deux_col(i) := deux_col_typ(l_var1(i), l_var2(i));
     31    End Loop;
     32    --
     33    open l_crs FOR SELECT t.col1, t.col2 FROM TABLE(l_deux_col) t;
     34    RETURN l_crs;
     35  End;
     36  /
     
    Fonction crÚÚe.
     
    mni@DIANA> variable rc refcursor
    mni@DIANA> set autoprint on
    mni@DIANA> exec :rc := foo;
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
     
     
    COL1       COL2
    ---------- ----------
    un         1
    deux       2
    trois      3
     
    mni@DIANA>
    "La PS" continue à me faire penser à la playStation

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

Discussions similaires

  1. Convertir une Requete vers une Table
    Par salafista dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/06/2007, 00h06
  2. [Oracle 9i] Export d'une vue vers une table.
    Par Cyborg289 dans le forum Oracle
    Réponses: 3
    Dernier message: 14/06/2006, 20h36
  3. Réponses: 16
    Dernier message: 20/03/2006, 23h21
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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