Page 1 sur 1
					
				SQL erreur -203
				Posté : lun. 29 mai 2017,  12:49:42
				par BrigitteG
				Bonjour,
Je dois sélectionner un certain nombre d'enregistrement par sql en utilisant using.
dans un script, la requête sql fonctionne très bien
Code : Tout sélectionner
select copaip, nunati, nobovi, nutrav, danais from file1 
join file2  using(copaip,nunati,cosu)                   
where copach = 'FR' and cheipg = '39258001' and cosu = '0' and     
dasort is null and xxx = '2'
group by COPAIP, NUNATI, Nobovi, Nutrav, Danais
order by COPAIP, NUNATI
J'inclue cette requête dans du code rpgle et aucun pb lors de la compile
Code : Tout sélectionner
EXEC SqL  DECLARE C1 CURSOR FOR
       SELECT COPAIP, NUNATI, Nobovi, Nutrav, Danais FROM file1
       join file2 using(copaip, nunati, cosu)
       where COPACH = :EàCopach and CHEIPG = :EàNuchep and DASORT is NULL and
       cosu = '0' and xxx = '2'
       group BY COPAIP, NUNATI, Nobovi, Nutrav, Danais
       order by COPAIP, NUNATI
       FOR FETCH ONLY;
       EXEC SqL OPEN C1;
       dow sqlCod = 0;
....
Lors du traitement de l'applicatif j'ai le code erreur
et j'obtiens un code erreur -203 (A column reference is ambiguous, because of duplicate names.)
Pouvez-vous me dire où je fais une erreur ? 
Je vous remercie d'avance pour votre réponse
 
			
					
				USING
				Posté : lun. 29 mai 2017,  13:13:50
				par cmasse
				Même version d'OS pour le script et le pgm ? 
le message d'erreur donne-t-il le nom de la colonne ?
			 
			
					
				SQL erreur -203
				Posté : lun. 29 mai 2017,  14:02:31
				par BrigitteG
				La zone est copaip.
la version de l'os est v7r2
			 
			
					
				using ??
				Posté : lun. 29 mai 2017,  14:32:44
				par cmasse
				je ne vois pas trop, ce code fonctionne chez moi (7.3)
Code : Tout sélectionner
**free
dcl-s compteur int(10);
dcl-s nomp char(50);
dcl-s nomv char(50);
dcl-s code int(10);
exec sql
  declare C1 cursor for
   select pr_code, pr_nom, vin_nom
  from bdvin1/producteur join bdvin1/vins using(pr_code);
exec sql open c1;
exec sql fetch c1 into :code, :nomp, :nomv;
dow sqlcode = 0;
   compteur += 1;
   exec sql fetch c1 into :code, :nomp, :nomv;
ENDDO;
exec sql close c1;
dsply (%char(compteur));
*inLR = *on;                 
 
			
					
				SQL erreur -203
				Posté : lun. 29 mai 2017,  15:36:55
				par BrigitteG
				La seule différence que je vois c'est ceci using(copaip,nunati,cosu)  j'ai trois zones au lieu d'une
avec votre code, aucun soucis.
			 
			
					
				doc SQL
				Posté : lun. 29 mai 2017,  16:15:22
				par cmasse
				Pourtant le doc dit 
Any column specified in the USING clause cannot be qualified in the query.
https://www.ibm.com/support/knowledgece ... oinedt.htm 
			
					
				pb compile
				Posté : mar. 30 mai 2017,  12:27:32
				par BrigitteG
				Ce code ne passe pas à la compilation
Code : Tout sélectionner
SELECT i.COPAIP, i.NUNATI, b.Nobovi, b.Nutrav, b.Danais FROM file1 i   
join file2 b using(copaip,nunati)                                      
where i.COPACH = :EàCopach and i.CHEIPG = :EàNuchep and i.DASORT is NULL
and i.cosu = '0' and b.xxx = '2'                                     
group BY i.COPAIP, i.NUNATI, b.Nobovi, b.Nutrav, b.Danais               
order by i.COPAIP, i.NUNATI                                             
SQL0205  30      83  Position 28 La colonne NUNATI ne se trouve pas dans la
                     table FILE1 de BIB1.                            
SQL0205  30      83  Position 18 La colonne COPAIP ne se trouve pas dans la
                     table FILE1 de BIB1.                            
mais celui-ci oui
Code : Tout sélectionner
SELECT i.COPAIP, i.NUNATI, b.Nobovi, b.Nutrav, b.Danais FROM file1 i
        left join file2 b on(i.copaip = b.copaip and i.nunati = b.nunati and
        i.cosu = b.cosu)
        where i.COPACH = :EàCopach and i.CHEIPG = :EàNuchep and i.DASORT is NULL
        and i.cosu = '0' and b.xxx = '2'
        group BY i.COPAIP, i.NUNATI, b.Nobovi, b.Nutrav, b.Danais
        order by i.COPAIP, i.NUNATI                
et fonctionne à l'exécution
 
			
					
				ON vs USING
				Posté : mar. 30 mai 2017,  14:24:31
				par cmasse
				Effectivement avec ON les zones de jointure sont présentes 2 fois (version "i" et version "b") on peux donc les qualifier.
Avec USING les zones de jointure ne sont présentes qu'une seule fois et ne peuvent pas être qualifiées. 
Ça ne m'explique pas votre code erreur -203 initial.  

 
			
					
				pareil avec deux zones de jointure
				Posté : mar. 30 mai 2017,  16:00:45
				par cmasse
				pareil avec deux zones de jointure, ce code s'exécute correctement :
Code : Tout sélectionner
**free
dcl-s compteur int(10);
dcl-s nomp char(50);
dcl-s nomv char(50);
dcl-s code int(10);
exec sql
  declare C1 cursor for
   select pr_code, pr_nom, vin_nom
  from bdvin1/producteur join bdvin1/vins using(pr_code, appel_code);
exec sql open c1;
exec sql fetch c1 into :code, :nomp, :nomv;
dow sqlcode = 0;
   compteur += 1;
   exec sql fetch c1 into :code, :nomp, :nomv;
ENDDO;
exec sql close c1;
dsply (%char(compteur));
*inLR = *on;                                          
 
			
					
				
				Posté : mer. 31 mai 2017,  10:13:57
				par BrigitteG
				Bonjour,
Avec votre requête, c'est ok. 
En procédant par élimination, c'est le order by qui me pose problème.
Code : Tout sélectionner
       EXEC SqL  DECLARE C1 CURSOR FOR
        SELECT Copaip, Nunati, b.Nobovi, b.Nutrav, b.Danais FROM IPGMOU
        join bovide b  using(copaip, nunati, cosu)
        where COPACH = :EàCopach and CHEIPG = :EàNuchep and DASORT is NULL
        and  b.xxx = '2' and cosu = '0'
        order by COPAIP, NUNATI ;
       EXEC SqL OPEN C1;
       EXEC SqL FETCH C1 INTO :wCOPAIP, :wNUNATI, :wNobovi, :wNutrav, :wDanais;           
       dow sqlCod = 0;
        exsr $ListeAnimal;
        EXEC SqL FETCH C1 INTO :wCOPAIP, :wNUNATI, :wNobovi, :wNutrav, :wDanais;
       enddo;
       EXEC SqL CLOSE C1;
Le nom COPAIP est ambigu. Et message -501 et il n'ouvre pas le curseur.
En enlevant l'order by, cela fonctionne. 
Problème que je ne rencontre pas en mettant un order by dans votre requête.
Code : Tout sélectionner
       dcl-s compteur int(10);
       dcl-s nomp char(50);
       dcl-s nomv char(50);
       dcl-s code int(10);
       exec sql
        declare C1 cursor for
        select pr_code, pr_nom, vin_nom
        from bdvin1/producteur join bdvin1/vins using(pr_code, appel_code)
        order by pr_code;
        exec sql open c1;
        exec sql fetch c1 into :code, :nomp, :nomv;
        dow sqlcode = 0;
         compteur += 1;
         exec sql fetch c1 into :code, :nomp, :nomv;
        ENDDO;
       exec sql close c1;
       dsply (%char(compteur));
       *inLR = *on;
Merci pour le coup de main. Si je trouve l'explication, je la mettrai sur le post.