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.