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 :

executer du PL/SQL depuis JAVA


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Points : 15
    Points
    15
    Par défaut executer du PL/SQL depuis JAVA
    Bonjour,
    Je souhaite exécuter la procédure PL/SQL suivante à partir d'un programme JAVA.
    Je ne peux pas la stocker en base et l'appeler depuis le programme java.
    Soit je réussi à l'exécuter directement à partir du programme ou sinon je devrais utiliser un Runtime.exec. Ce que je préférerais ne pas faire.

    DECLARE
    v_dynam varchar2(1000);
    cursor fk_cursor is
    select table_name, constraint_name from user_constraints where constraint_name like 'FK_%';

    BEGIN

    for c_row in fk_cursor loop
    v_dynam := 'ALTER TABLE '||c_row.table_name||' DROP CONSTRAINT '||c_row.constraint_name;
    execute immediate v_dynam;
    end loop;

    END;
    /

    show errors;

    J'ai essayé ça :
    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
    18
    19
    20
    21
    22
    23
     
    m_dbConnection = DriverManager.getConnection(m_strConnectURL, m_strLogin, m_strPassword);
    String strProc =  
             "DECLARE \n" +
             "   v_dynam varchar2(1000);\n" +
             "   cursor fk_cursor is\n" +
             "      select table_name, constraint_name from user_constraints where constraint_name like 'FK_%';\n" +
             "" +
             "BEGIN\n" +
             "" +
             "   for c_row in fk_cursor loop\n" +
             "      v_dynam := 'ALTER TABLE '||c_row.table_name||' DROP CONSTRAINT '||c_row.constraint_name;\n" +
             "      execute immediate v_dynam;\n" +
             "   end loop;\n" +
             "" +
             "END;\n" +
             "/\n" +
             "" +
             " show errors;\n" +
             "" +
             "exit\n";
    PreparedStatement psProcToexecute = m_dbConnection.prepareStatement(strProc);
    psProcToexecute.execute();
    mais j'obtiens toujours l'erreur :
    java.sql.SQLException: ORA-06550: line 11, column 1:
    PLS-00103: Encountered the symbol "/"

    Quelqu'un aurait-il une suggestion?

  2. #2
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, c'est difficile de savoir comme ça quelle ligne ne fonctionne pas.

    Par contre j'ai récemment adapté un parser trouvé sur le net, si une seule requête plante, cela t'indiquera laquelle. Il exécute correctement mes scripts (création de base, tables, fonctions) avec une base Postgresql et est en théorie compatible avec Oracle.

    Ca te permettra de modifier ton script sans toucher au code.
    Il suffit de donner une connexion et un fichier à la méthode execute, le fichier va être parsé et les requêtes exécutées une à une.

    Voici le code (désolé c'est en anglais et sans commentaires...) :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    public class SQLScriptEngine {
        public static void execute(Connection connection, File file)
        throws IOException, SQLException {
            System.out.println("Reading from file " +
            file.getAbsolutePath());
            BufferedReader reader = new BufferedReader(new
            FileReader(file));
            StringBuffer sqlBuf = new StringBuffer();
            String line;
            boolean statementReady = false;
            int count = 0;
            boolean declaringFunction = false;
            while ((line = reader.readLine()) != null) {
                // different continuation for oracle and postgres
                line = line.trim();
     
                if(line.contains("$$") || line.contains("$_$") || line.contains("$BODY$")) {
                    declaringFunction = !declaringFunction;
                }
     
                if (line.equals("--/exe/--"))   // execute finished statement for postgres
                {
                    sqlBuf.append(' ');
                    statementReady = true;
                }
                else if (line.equals("/")) // execute finished statement for oracle
                {
                    sqlBuf.append(' ');
                    statementReady = true;
                }
                else if (line.startsWith("--") || line.length() == 0)  // comment or empty
                {
                    continue;
                }
                else if (!declaringFunction && line.endsWith(";"))
                {
                    sqlBuf.append(' ');
                    statementReady = true;
                    sqlBuf.append(line.substring(0, line.length() - 1));
                }
                else
                {
                    sqlBuf.append(' ');
                    sqlBuf.append(line);
                    statementReady = false;
                }
                if (statementReady) {
                    if (sqlBuf.length() == 0) continue;
                        executeQuery(connection, sqlBuf.toString());
                        count ++;
                        sqlBuf.setLength(0);
                    }
            }
     
            System.out.println("" + count + " statements processed");
            System.out.println("Import done sucessfully");
     
        }
     
        public static void executeQuery(Connection connection, String request) {
            Statement statement;
            try {
                System.out.println("Executing statement : " + request);
                statement = connection.createStatement();
                statement.execute(request);
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Tu devrais retirer la ligne

    ...
    "/\n"
    +
    ...
    le "/" est suspect devant le "\n"...
    (et en plus, c'est la ligne 11)
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    a mon avis c'est plutôt du côté des CallableStatement qu'il faut aller voir ...

    en tous cas c'est comme ça que je fais moi ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu devrais retirer la ligne
    le "/" est suspect devant le "\n"...
    (et en plus, c'est la ligne 11)
    A+
    la procédure fonctionne sous sqlplus avec le "/" ligne 11.
    C'est un caractère obligatoire pour indiquer la fin de la procédure.
    Il ne marche pas en le lançant à partir du programme java.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par in Voir le message
    a mon avis c'est plutôt du côté des CallableStatement qu'il faut aller voir ...

    en tous cas c'est comme ça que je fais moi ...
    Le "CallableStatement" ne doit-il pas être utilisé pour exécuter une procédure stocker? Je ne peux malheureusement pas ajouter cette procédure dans la base.

  7. #7
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Et le PreparedStatement ne doit-il pas être utilisé pour exécuter une requête précompilée ?

    Pour moi en tous cas le code suivant fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallableStatement stmt = connection.prepareCall("begin ...; end;");
    Après je n'ai pas essayé avec declare, show errors ... mais bon a priori un bloc pl/sql peut être exécuté de cette manière. Dans tous les cas ça ne coute rien d'essayer ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par in Voir le message
    Et le PreparedStatement ne doit-il pas être utilisé pour exécuter une requête précompilée ?

    Pour moi en tous cas le code suivant fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallableStatement stmt = connection.prepareCall("begin ...; end;");
    Après je n'ai pas essayé avec declare, show errors ... mais bon a priori un bloc pl/sql peut être exécuté de cette manière. Dans tous les cas ça ne coute rien d'essayer ...
    OK merci, je vais faire le test, je vais enlever "show errors" qui n'est pas indispensable. Je posterais le résultat.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 27
    Points : 15
    Points
    15
    Par défaut cerveau léthargique
    Alors la solution été vraiment simple.
    J'ai modifié la procédure, j'ai supprimé l "/" ligne 11 et tout ce qui suivait (OButterlin mea culpa) :
    DECLARE
    v_dynam varchar2(1000);
    cursor fk_cursor is
    select table_name, constraint_name from user_constraints where constraint_name like 'FK_%';
    BEGIN
    for c_row in fk_cursor loop
    v_dynam := 'ALTER TABLE '||c_row.table_name||' DROP CONSTRAINT '||c_row.constraint_name;
    execute immediate v_dynam;
    end loop;
    END;

    ET CA MARCHE avec PreparedStatement et CallableStatement.
    Le problème venait juste de mon cerveau trop fainéant pour trouver le bon test à faire.
    Merci pour vos réponses.

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

Discussions similaires

  1. [SQL] Executer un script SQL depuis php
    Par sly3333 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/12/2007, 01h33
  2. comment executer du Visual Basic depuis Java?
    Par Mansou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 28/08/2007, 07h52
  3. executer les proc sql en java
    Par bicho dans le forum JDBC
    Réponses: 1
    Dernier message: 16/05/2007, 16h25
  4. executer un fichier sql depuis VB6
    Par aymenagrebi dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/04/2007, 22h07
  5. Executer un script SQl depuis VB
    Par Sytchev3 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 22/03/2007, 20h06

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