IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

PL/pgSQL et JDBC


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 50
    Points : 46
    Points
    46
    Par défaut PL/pgSQL et JDBC
    Bonjour à tous.
    Je cherche à créer un programme qui utilise une DB PosgreSQL (pour apprendre... ce qui signifie que je suis un plot. Désolé donc si la / les question sont bêtes).

    Pour commencer, je veux qu'au démarrage, le programme vérifie que la base de données est présente (et la crée en le signifiant si elle n'existe pas). Pour ce faire, je veux exécuter la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    DO
    $do$
    DECLARE
      _db TEXT := 'nomDB';
      _user TEXT := 'postgres';
      _password TEXT := 'dbpass';
    BEGIN
      CREATE EXTENSION IF NOT EXISTS dblink; -- enable extension 
      IF EXISTS (SELECT 1 FROM pg_database WHERE datname = _db) THEN
        RAISE NOTICE 'Database already exists';
      ELSE
        PERFORM dblink_connect('host=localhost user=' || _user || ' password=' || _password || ' dbname=' || current_database());
        PERFORM dblink_exec('CREATE DATABASE ' || _db);
      END IF;
    END
    $do$
    Alors, je vois un peu comment mettre le JDBC en Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    try {
                Class.forName("org.postgresql.Driver");
                System.out.println("Driver O.K.");
     
                String url = "jdbc:postgresql://localhost:5432/postgres";
                String user = "postgres";
                String passwd = "dbpass";
     
                Connection conn = DriverManager.getConnection(url, user, passwd);
                System.out.println("Connexion effective !");
     
                Statement s = conn.createStatement();
                ResultSet rs = s.executeQuery(???);
            } catch (ClassNotFoundException | SQLException e)
    Problèmes : je ne vois pas du tout comment envoyer la requête : je fourre tout dans un String ? Du coup ça ne va pas planter juste parce que je fais des retours ligne ? Le RAISE NOTICE va revenir dans mon ResultSet ?

    Merci d'avance pour vos réponses

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    En gros, oui c'est "l'idée".
    Par contre, je ne ferais pas tout le job en une requête, mais plutôt :
    1. Connection à PostgreSql
    2. Vérifier si la base de données existe
    3. Si la base de données n'existe pas, alors la créer
    4. Continuer la suite de vos traitements


    Rapide exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Class.forName("org.postgresql.Driver");
    System.out.println("Driver O.K.");
     
    String url = "jdbc:postgresql://localhost:5432/postgres";
    String user = "postgres";
    String passwd = "dbpass";
     
    Connection conn = DriverManager.getConnection(url, user, passwd);
    System.out.println("Connexion effective !");
     
    Statement stmt = conn.createStatement();
    // On regarde si la base de données existe
    ResultSet rs = stmt.executeQuery("SELECT datname FROM pg_database WHERE datname LIKE 'foo';");
    // Si la base de données n'existe pas
    if(!rs.next()){
    	stmt.executeQuery("CREATE DATABASE foo;");
    }
    Bon courage

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 50
    Points : 46
    Points
    46
    Par défaut
    Merci bien !

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 50
    Points : 46
    Points
    46
    Par défaut
    Finalement ce n'est résolu qu'à moitié...
    J'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
                Statement s = conn.createStatement();
                ResultSet rs = s.executeQuery("SELECT datname FROM pg_database WHERE datname LIKE 'foo';");
                if (!rs.next()) {
                    System.err.println("La base de données n'existe pas");
    /*l.44*/     s.executeQuery("CREATE DATABASE foo");
                }
            } catch (SQLException e) {
                System.err.println("Problème avec la création de la base de données.");
                e.printStackTrace();
            }
            System.out.println("Tout est OK !!");
    Ce qui me met dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Tout est OK !!
    Problème avec la création de la base de données.
    org.postgresql.util.PSQLException: Aucun résultat retourné par la requête.
    	at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:225)
    	at ClassMain.main(ClassMain.java:44)
    Du coup j'ai une erreur
    Le truc vraiment bizarre, c'est que la base de données est créée quand même ! Quelqu'un a une explication ? Du coup je pourrais continuer mais ça fait pas super propre...

    [EDIT : problème résolu !
    Pour ceux qui auraient le même problème, pour créer des tables/database, il faut utiliser executeUpdate au lieu d'executeQuery.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(!rs.next()){
    	stmt.executeUpdate("CREATE DATABASE foo;");
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSP][JDBC]1 seule connexion à la DB(suite)
    Par betherb dans le forum JDBC
    Réponses: 6
    Dernier message: 14/08/2003, 10h02
  2. [POSTGRESQL et JDBC] la langue de moliere
    Par jah dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 15/05/2003, 11h21
  3. JBuilder 8 et JDBC/PostgreSQL
    Par nicox dans le forum JBuilder
    Réponses: 2
    Dernier message: 14/05/2003, 15h43
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. insérer des caractères accentués INFORMIX/JDBC
    Par donde dans le forum Informix
    Réponses: 2
    Dernier message: 19/11/2002, 20h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo