Bonjour,

J'ai un problème d'interprétation de requête dans une clause IN.

Je pars d'un logiciel que je ne contrôle qui récupère une liste de magasins au format VARCHAR(N) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
LISTE_MAG := '''24'',''30'',''52'''
Le N s'adapte au nombre de magasins récupérés.

Voici le code :
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
create or replace PROCEDURE PROMO_W (LISTE_MAG VARCHAR2) IS
 
    nb_mag                                          NUMBER(4);
    vcode_mag                                       NUMBER(4);
    vliste_mag                                  VARCHAR2(200);
    vliste_mag2                                 VARCHAR2(200);
 
BEGIN
 
  vliste_mag2 := translate(LISTE_MAG, 'A''', 'A');
  DBMS_Output.Put_Line ('Magasins translate : '||vliste_mag2);
 
  vliste_mag2:=','||vliste_mag2||',';
  SELECT REGEXP_COUNT(vliste_mag2,',',1,'i')-1 INTO nb_mag FROM dual;
  DBMS_Output.Put_Line ('Nb Magasins : '||nb_mag);
 
  vliste_mag := null;
  FOR i IN 1..nb_mag
  LOOP
    SELECT substr(vliste_mag2,1+instr (vliste_mag2,',',1,i),instr (vliste_mag2,',',1,i+1)- instr (vliste_mag2,',',1,i)-1) INTO vcode_mag FROM dual;
    vliste_mag := vliste_mag||','||to_number(vcode_mag);
  END LOOP;
 
  vliste_mag := substr(vliste_mag,2);
 
  DBMS_Output.Put_Line ('Magasins 2  : '||vliste_mag);
 
  FOR mag in (select nommagasin from magasins where codemagasin in (vliste_mag))
  LOOP
    DBMS_Output.Put_Line ('Magasins : '||mag.nommagasin);
  END LOOP;
END;
Je n'arrive pas à récupérer correctement ma liste de magasins pour ma condition
Code : Sélectionner tout - Visualiser dans une fenêtre à part
where codemagasin in (vliste_mag)
J'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Connexion à la base de données BBD_R7.
ORA-01722: Nombre non valide
ORA-06512: à "PROMO.PROMO_W", ligne 57
ORA-06512: à ligne 8
Magasins Init : '24','30','52'
Magasins translate : 24,30,52
Nb Magasins : 3
Magasins 2  : 24,30,52
Processus fermé.
Déconnexion de la base de données BBD_R7.
Est-ce qu'il existe un moyen de contourner ce problème sans passer par une boucle ?

Merci d'avance pour l'aide