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 16/03/2011, 16h18   #1
Invité de passage
 
Inscription : mars 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 4
Points : 0
Points : 0
Par défaut Utilisation d'une variable pour un IN en PL/SQL

Bonjour,

Je n'ai pas de souci pour créer une fonction en PL/SQL avec des arguments sous forme de chaînes ou de nombres (extraits)

Code :
1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION mafonction (p_1 IN INTEGER, p_2 IN VARCHAR2) 
RETURN VARCHAR2 IS
cursor moncurseur (c_1 integer, c_2 varchar2) IS SELECT A, B, C FROM matable
WHERE A=c_1 AND B=c_2;
...
FOR vc1 IN moncurseur(p_1, p_2) LOOP
...

Par contre, je n'arrive pas à trouver dans la doc Oracle comment faire pour que mon argument c_2 soit une liste utilisable avec une syntaxe IN au lieu d'un simple =

Code :
1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION mafonction (p_1 IN INTEGER, p_2 IN ????) 
RETURN VARCHAR2 IS
cursor moncurseur (c_1 integer, c_2 ????) IS SELECT A, B, C FROM matable
WHERE A=c_1 AND B IN c_2;
...
FOR vc1 IN moncurseur(p_1, p_2) LOOP
...


Est-ce que quelqu'un a une réponse ou un lien vers une doc qui explique ce genre de syntaxe ?
sacramento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h34   #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 808
Points : 5 808
Pour quelle version d'Oracle ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h40   #3
Invité de passage
 
Inscription : mars 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 4
Points : 0
Points : 0
Oracle 10g
sacramento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h44   #4
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 808
Points : 5 808
Voilà un example
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
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> SET serveroutput ON
SQL> 
SQL> CREATE OR REPLACE procedure foo (
  2    p_list_emp  IN sys.odcivarchar2list
  3  ) IS
  4  Begin
  5    FOR enr IN (SELECT t.first_name
  6                  FROM hr.employees t
  7                  WHERE t.job_id IN (SELECT column_value
  8                                       FROM TABLE(p_list_emp)
  9                                    )
 10                )
 11    Loop
 12      dbms_output.put_line(enr.first_name);
 13    End Loop;
 14  End;
 15  /
 
Procedure created
SQL> declare
  2    l_list sys.odcivarchar2list := sys.odcivarchar2list('AC_MGR','IT_PROG','ST_CLERK');
  3  begin
  4    foo(l_list);
  5  end;
  6  /
 
Shelley
Diana
Valli
David
... 
PL/SQL procedure successfully completed
 
SQL>
Et une autre téchnique est binding in-lists in 10g
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 17h25   #5
Invité de passage
 
Inscription : mars 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 4
Points : 0
Points : 0
Merci,

Je vais regarder.
Mais étrange qu'un truc qui paraît si simple puisse se transformer en usine à gaz.
sacramento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 18h21   #6
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 808
Points : 5 808
Lisez aussi Varying in lists avant de parlez de usine à gaz.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 18h28   #7
Invité de passage
 
Inscription : mars 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 4
Points : 0
Points : 0
On ne va pas rentrer dans une polémique, mais avouez quand même que ce n'est pas ce qu'il y a de plus simple pour utiliser une liste dans les paramètres d'une fonction.

J'apprécie votre réponse, mais ne vous sentez pas agressé parce qu'Oracle n'a pas choisi la simplicité. Ce n'est pas votre faute.
sacramento est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h07.


 
 
 
 
Partenaires

Hébergement Web