SQL erreur -203

RPG (3 et 4, free), CL, SQL, etc...
Répondre
BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

SQL erreur -203

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

USING

Message 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 ?
Christian Massé (Volubis.fr)

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

SQL erreur -203

Message par BrigitteG »

La zone est copaip.
la version de l'os est v7r2

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

using ??

Message 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;                 
Christian Massé (Volubis.fr)

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

SQL erreur -203

Message 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.

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

doc SQL

Message 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
Christian Massé (Volubis.fr)

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

pb compile

Message 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

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

ON vs USING

Message 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. :lol:
Christian Massé (Volubis.fr)

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

pareil avec deux zones de jointure

Message 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;                                          
Christian Massé (Volubis.fr)

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Message 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.

Répondre