Votre question

Problème erreur SQL en java

Tags :
  • Java
  • Sql
  • Programmation
Dernière réponse : dans Programmation
11 Octobre 2011 09:50:59

Bonjour chers Collègues !

J'ai un petit soucis avec mon code Java pour accéder à une base de type DB2 sur un serveur AS400

public DataBase(String url, String login, String pass) throws SQLException {

Connection connection = DriverManager.getConnection(url, login, pass);
Statement stt = connection.createStatement();
ResultSet resultat = stt.executeQuery("SELECT * FROM MINOSFIC.UB001V01");


Le programme bute à l'executeQuerry en me sortant :

Exception in thread "main" java.sql.SQLException: [SQL0443] *N

Je suis allé voir sur le site d'IBM pour trouver de quoi il en retourne :

Message Text: Trigger program or external routine detected an error.
Cause Text: Either a trigger program, external procedure, or external function detected and returned an error to SQL. If the error occurred in a trigger program, the trigger was on table &4 in schema &5. If the error occurred in an external procedure or function, the external name is &4 in schema &5. The associated text is &6. If the error occurred in a trigger program, the associated text is the type of trigger program. If the error occurred in an external function, the associated text is the text of the error message returned from the external function.
Recovery Text: Refer to the joblog for more information regarding the detected error. Correct the error and try the request again.

Le soucis c'est que ça ne m'a pas plus aidé que ça ... Quelqu'un saurait m'aiguiller ou me fournir une solution adéquate ? Merci :D 

Autres pages sur : probleme erreur sql java

a c 232 L Programmation
11 Octobre 2011 10:25:12

Salut,

Essaie de catcher l'exception et de voir si tu peux avoir plus d'informations sur ton erreur exacte ?

Là comme ça, je te dirais de vérifier le nom de tes tables/schémas
11 Octobre 2011 10:41:56

OmaR a dit :
Salut,

Essaie de catcher l'exception et de voir si tu peux avoir plus d'informations sur ton erreur exacte ?

Là comme ça, je te dirais de vérifier le nom de tes tables/schémas


J'ai testé directement sur l'émulateur AS400 et la requête fonctionne parfaitement et me ramène mon SELECT sans soucis.
En catchant l'exception avec un try/catch(Exception e){System.out.println(exc.toString());}
Ca me ramène : java.sql.SQLException: [SQL0443] *N

Contenus similaires
11 Octobre 2011 11:03:18

OK !
J'ai l'impression qu'il aime pas le caractère * (il doit pas être codé pareil sous l'AS400 ou un tuc du genre car quand j'utilise le nom des colonnes la place du caractère * il me sort ce que je veux...)
Mais bon il y a plusieurs colonnes ... même beaucoup ... y'a surement une solution pour pouvoir utiliser ce caractère, car vu le nombre de table je vais devoir l'utiliser...
11 Octobre 2011 11:11:41

En fait c'est pas du tout ça ...
il y a beaucoup de colonnes comme je le disais si bien que lorsque je tape la commande sur l'émulateur je dois me déplacer sur l'écran suivant (en fait je me déplace vers la droite) pour effectuer une visualisation des réponses de la requête des colonnes suivantes.
Je suis certain de mon coup puisque j'ai testé la requête avec le nombre de colonne visible sur l'écran ainsi qu'avec un nombre de colonnes dépassant le nombre visible.

Comment puis-je faire pour obtenir toutes les colonnes (sur l'émulateur je fais shift + f8 pour me déplacer vers la droite) ?
11 Octobre 2011 11:14:14

Pour aider :

Lorsque j'effectue cette requête "SELECT DAT, HEUR, CODE_EXP, EXPEDITEUR, REFERENCE, TYP, STATUT FROM etc etc" j'obtiens :

12/01/11|07:44:34|truc |machin |FCBBC0007417|1|60
12/01/11|14:54:44|truc |machin |FCBBC0006199|1|60
13/01/11|07:46:26|truc |machin |FCBBC0006257|1|60
14/01/11|13:52:44|truc |machin |FCBBC0006055|1|60
etc etc

Donc ma requête fonctionne.
Par contre si je demande plus de colonnes dans ma requête j'obtiens la fameuse erreur sql *N ...
a c 232 L Programmation
11 Octobre 2011 11:31:30

Ne fais pas un
  1. catch(Exception e) { System.out.println(e.toString()); }


Mais plutôt:
  1. catch (SqlException e)
  2. {
  3. while (e != null)
  4. {
  5. System.out.println("Message: " + e.getMessage());
  6. System.out.println("SQLState: " + e.getSQLState());
  7. System.out.println("ErrorCode: " + e.getErrorCode());
  8. e = e.getNextException();
  9. }
  10. }


Tu devrais avoir un peu plus d'informations.

Edit: c'est peut être une colonne qui pose problème.
Essaie de déterminer quelle colonne pose problème (en prenant d'abord la 1ère moitié des colonnes, si ça fonctionne, ne prend que la 2ème moitié des colonnes). Si les 2 moitiés fonctionnent séparément, c'est que c'est pas à cause d'une colonne.
S'il y a une moitié qui ne fonctionne pas, redivise la en 2 et exécute séparément jusqu'à trouver la colonne qui pose problème.
11 Octobre 2011 12:35:52

Effectivement ça venait bien d'une colonne.
Je l'ai identifié cette vilaine ! Et dans cette colonne, il y a des noms de sociétés.
On retrouve le caractère espace, le caractère point, le caractère &, le caractère -, le caractère '
Crois tu que c'est à cause de ces divers caractères que mon executeQuerry plante ?
a c 232 L Programmation
11 Octobre 2011 13:47:30

Ca me parait bizarre que ça puisse être en fonction d'une valeur (mais on ne sait jamais...)
J'aurais plutôt dit en fonction du nom de la colonne, il n'y a pas de caractères spéciaux dans le nom de la colonne?

Si tu fais un SELECT taColonne FROM taTable WHERE 1=0
De manière à ce que tu retournes aucune ligne, est-ce que ça fonctionne ?

Et si c'est une valeur qui fait planter, j'aurais tendance à dire le caractère '
11 Octobre 2011 14:07:53

Ca fonctionne (j'ai aucune ligne mais pas de message d'erreur) donc ça vient bien des caractères des données dans la colonne.
11 Octobre 2011 14:23:40

Enfin, peut être pas.
J'ai essayé la requête SELECT NOM FROM matable WHERE NOM = 'nom sans caractères ni espace'
Et elle me renvoie :

Message: [SQL0443] *N
SQLState: 38501
ErrorCode: -443
a c 232 L Programmation
11 Octobre 2011 15:33:22

Il semblerait qu'il y a un fichier de log "db2diag.log" qui pourrait te donner plus d'informations sur l'erreur.
N'ayant jamais fait ça, je ne pourrais te dire où il est situé.

11 Octobre 2011 15:57:42

Pas de soucis. Je te remercie en tout cas.
Je suis allé posté ça sur infos du net, développez.com et ici
Y'a qu'une seule personne qui a réussi à comprendre et à vouloir aider à résoudre ce soucis de foufou et c'est toi ;D

Si tu veux je te tiens au jus de ce que je peux obtenir avec ce .log ;) 
a c 232 L Programmation
11 Octobre 2011 17:30:43

Pas de soucis, dis-moi ce que tu obtiens de ce fichier .log... si tu arrives à le trouver :) 
12 Octobre 2011 09:32:00

OmaR a dit :
Pas de soucis, dis-moi ce que tu obtiens de ce fichier .log... si tu arrives à le trouver :) 


Je le cherche toujours ;) 
Inconnu au bataillon sur mon PC ...
12 Octobre 2011 10:53:45

J'ai effectué pas mal de recherches avec un collègue au bureau qui lui connait bien l'environnement dans lequel je voulais effectuer ma requête.

Il a eu du mal également mais a réussi à trouvé de quoi venait le problème.

Ma requête attaque en fait une vue. Dans cette vue, il y a de nombreuses procédures d'utilisateur qui sont utilisées. On en a déduit que le problème venait de là.

Mon collègue a donc copié le résultat de cette vue (disponible sous l'émulateur as400 si tu me suis toujours :D ) et l'a copié dans une table dans un fichier temporaire pour que je puisse effectuer ma requête malgré le fait que j'attaquerai une table différente du coup (le nom est différent mais la table est juste une copie conforme de ce que je voulais avoir en fait).

Qu'en penses tu ? Moi j'ai vomis 3 fois :mouarf:
a c 232 L Programmation
12 Octobre 2011 11:08:54

J'ai bossé sur AS400 pendant une semaine il y a quelques années, mais c'était principalement pour faire des sauvegardes et vérifier que les sauvegardes s'effectuaient bien. Ca s'arrête à peu près à ça mes connaissances en AS400... puis c'était y'a longtemps alors je ne saurais même plus faire :) 

Mais je vois ce que tu veux dire avec tes vues et tes procédures, etc...
Ce qui explique un peu plus le code erreur que je ne voyais pas ce qu'il venait faire là-dedans... (de mémoire ça parlait d'une erreur de procédure).
Et tu ne peux pas attaquer directement la table initiale ? Plutôt que d'attaquer la vue comme tu le faisais ou d'attaquer une copie de la table ?
12 Octobre 2011 11:36:26

Non je ne peux pas, ça aurait été si simple ... :) 

Du coup maintenant tout fonctionne à part le fait que mon programme plante sur mon getString du resulset puisqu'à un moment il y a des trous dans les données de la table, mais ça je suppose que je vais trouver rapidement.

Merci en tout cas de l'aide apportée.

Excellent journée à toi,

Cordialement, Baboulinet.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS