Problème script sql en java

Bonjour,

Je suis actuellement entrain de créer un programme java qui ouvre des scripts sql et les éxécute.
Exemple, dans mon dossier il y a un script qui crée une table, un aute qui insère des données, qui select ect (j’ai 5 fichiers sql pour tester).

Au début, à l’éxecution, j’avais des erreurs de connexion a la base, de sql non valide, de caractère, …
J’ai réglé tout ça, il n’y a plus aucune erreur quand j’éxécute mon java, toutes les requêtes sont bien récupérées et éxecutées, pourtant dans mon sgbd (sqlDeveloper), rien ne se passe, la table n’est pas créer, rien.
Alors que si je prends toutes ces instructions et je le les copie/colle dans le sgbd directement tout fonctionne.

Comment puis-je faire marché mon programme alors que je n’ai aucun message d’erreur ni rien !!

Auriez vous une solution ou des idées d’ou le problème pourrait venir ?

Cordialement
Un stagiaire en developpement :smiley:

un commit qui manque ?

Non ce n’est pas ça, merci quand même? :wink:

Un extrait de ton code où tu te connectes et exécutes une requête ?

public static void performBatch(Connection conn, String path)
	{
		Statement stmt;
                String sautDeLigne = ";";
		try
		{
			stmt = conn.createStatement();  
			String str;
			while ((str = in.readLine()) != null) {
				System.out.println(str);
				
				if(str.contains(sautDeLigne)) {
					stmt.executeBatch();
					conn.commit();
				}
			}
			in.close(); //Lecture fini donc on ferme le flux
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		//Connexion a la base

		DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
		Connection conn =null;
		try{

			conn = DriverManager.getConnection
					("jdbc:oracle:thin:@xxx.xx.xxx:xxxx:SOCLECRDB", "", "");
		} catch ( SQLException e ) {System.out.println(e);}

			if(conn==null){
				System.out.println("CONNEXION FAILED !");
			}else{
				System.out.println("CONNEXION SUCCED ! n");
			}

			Statement stmt= conn.createStatement();		

			File dossierATraiter = new File("C:UsersAdminDesktopprojetDocProjet 3test");
			File [] dossier= dossierATraiter.listFiles();
			int taille=dossier.length;

			for(int i=0;i<=taille-1;i++){
				String path=dossier[i].getAbsolutePath();
				performBatch(conn, path);
				System.out.println("----- Fichier "+(i+1)+" Traité -----");
				System.out.println("----- Changement de fichier -----");
			}	
			System.out.println("Fermeture du statement");
			stmt.close();
			System.out.println("Fermeture de la connexion");
			conn.close();
		}
	}

J’ai un dossier qui contient 5 fichiers sql (create,insert,select,update,delete), je les récupère, passe leur url à la fonction.
Cette fonction les lit, quand il trouve le “;” soit la fin de la requete, il l’exécute. Puis il prend le deuxième fichier ect.
Edité le 06/02/2015 à 10:25

Salut,

De ce que je lis dans ta méthode performBatch(…), tu stockes la ligne lue dans ta variable str (que tu affiches en passant) mais tu ne l’utilises pas quand tu appelles ta méthode stmt.executeBatch(), bilan tu n’exécutes aucune requête.
Essaye plutôt stmt.execute(str) ?

pastebin.com…

Plusieurs choses :

  1. j’ai adapté ton exemple à Java 7, car de toute façon la 8 est sortie, et plus important, la 7 n’est plus supportée par Oracle.
    Je t’invite à lire la documentation d’Oracle: docs.oracle.com…

Tu peux faire de même pour Connection.

  1. J’ai de gros doutes quant à ce que ta commande soit adaptée à de la création de table, mais celle que tu cherche c’est addBatch[/url]. Tu peux voir l’exemple adapté ici : [url=http://pastebin.com/PYvDBhRE]pastebin.com…

  2. J’ai dégagé le commit par batch. Utilises plutôt setAutoCommit sur la connexion, vu que toute façon tu exécute par batch (ie: ce n’est pas envoyé avant le executeBatch).

Et au passage, sous Oracle, les DDL ne sont normalement pas transactionnel.
Edité le 06/02/2015 à 21:20

Je reviens car en m’inspirant de vos réponses j’ai trouvé la solution.

Une requête “bien écrite” est du style :

Create table test(
num …,
nom …,
prenom …
)

Or pour qu’elle soit correctement exécutée par java elle doit être en une seule ligne :

Create table test( num …,nom …, prenom…)

Autre point :

  1. pas de point virgule à la fin de la requête. Pareil pour tout les types de requêtes (select insert update …)
  2. toutes les requêtes ne s’exécute pas avec les mêmes fonctions de jdbc : pour une requete select on utilise executeQuery(string), pour les create/insert/update/delete il faut utiliser addBatch(string) puis executeBatch(), ect

Voila voila, si sa peut aider qulequ’un d’autre …
A bientot !