Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2011, 11h47   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 53
Points : 14
Points : 14
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 :
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 :
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 :
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.
Olif_C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 13h51   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 810
Points : 5 810
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]
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 14h45   #3
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 53
Points : 14
Points : 14
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 ?)
Olif_C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 15h46   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h12   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 810
Points : 5 810
Voilà un example bidon.
Code :
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 :
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h25   #6
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 53
Points : 14
Points : 14
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 :
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 :
1
2
3
4
5
6
 
COLUMN_VALUE        COLUMN2_VALUE
--------------------------------------------------------------------------------
un                          1
deux                       2
trois                        3
Olif_C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 21h48   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 810
Points : 5 810
Code :
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>
"
Click to View Search Results for La PS La PS
" continue à me faire penser à la playStation
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 10h52   #8
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 53
Points : 14
Points : 14
Yes, un GRAND Merci, mnitu. J'ai enfin pu mettre en place cette fonction grâce à ton aide.
Ensuite, pour fêter ça, j'ai joué à la PS toute la soirée, puis suivi les évolutions des mammouths du PS une bonne partie de la nuit, lancé PS pour faire quelques photo-montages (ma grande passion), et enfin fini de coder ma PS appelée par cette fonction.

PS : Ceci étant, à nouveau, un grand merci pour ton aide .
Olif_C est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h34.


 
 
 
 
Partenaires

Hébergement Web