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

PL/SQL Oracle Discussion :

FORALL EXECUTE IMMEDIATE USING


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut FORALL EXECUTE IMMEDIATE USING
    Bonsoir ,
    j'essaye de remplacer dans une procédure le code suivant,qui fonctionne,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    OPEN monCurseur;
    FETCH monCurseur BULK COLLECT INTO maCollection;
    CLOSE monCurseur;
    FOR i IN maCollection.FIRST..maCollection.LAST LOOP
    EXECUTE IMMEDIATE maCollection(i).colonne1;
    END LOOP;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    OPEN monCurseur;
    FETCH monCurseur BULK COLLECT INTO maCollection;
    CLOSE monCurseur;
    FORALL i IN maCollection.FIRST..maCollection.LAST LOOP
    EXECUTE IMMEDIATE ':1' USING maCollection(i).colonne1;
    END LOOP;
    maCollection(i).colonne1 contient une instruction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO TABLE2 ( SELECT * FROM TABLE3)
    Mais en faisant cela ,je reçois à l’exécution l'erreur suivante: "invalid SQL statement"
    J'ai l'impression que j'utilise le USING de manière incorrecte.Pourriez-vous m'aider?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    salut

    une instruction forall n'admet pas de LOOP à la fin.
    Mais ça n'est p-e pas le seul problème... voyons une fois que tu auras changé ça

    a+

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Oui,désolé.
    Avec le code suivant ,j'obtiens toujours "invalid SQL statement"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OPEN monCurseur;
    FETCH monCurseur BULK COLLECT INTO maCollection;
    CLOSE monCurseur;
    FORALL i IN INDICES OF maCollection
    EXECUTE IMMEDIATE ':1' USING maCollection(i).colonne1;

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    fait un dbms_output de tes requêtes au lieu du execute immediate pour voir exactement ce qui est executé

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    maCollection(i).colonne1 contient bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE2 ( SELECT * FROM TABLE3)
    C'est la manière dont j'utilise la variable :1 et USING qui doit être erronée.

    Si je tente le USING avec le FOR LOOP et que je remplace
    colonne1=INSERT INTO TABLE2 ( SELECT * FROM TABLE3) par
    colonne1=( SELECT * FROM TABLE3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    OPEN monCurseur;
    FETCH monCurseur BULK COLLECT INTO maCollection;
    CLOSE monCurseur;
    FOR i IN maCollection.FIRST..maCollection.LAST LOOP
    DBMS_OUTPUT.PUT_LINE('MA REQUETE='|| maCollection(i).colonne1;
    EXECUTE IMMEDIATE 'INSERT INTO TABLE2 :1' USING maCollection(i).colonne1;
    END LOOP;
    J'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MA REQUETE=( SELECT * FROM TABLE3)
    EXCEPTION ORA-00926: mot-clé VALUES absent
    donc ,j'en conclus que ma variable :1 est remplacée par le vide.

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    ...
    EXECUTE IMMEDIATE 'INSERT INTO TABLE2 :1' USING maCollection(i).colonne1;
    Vous ne pouvez pas passer une partie de la requête via des variables de liaison.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    on peut toutefois passer les champs et les valeurs c'est bien ça?

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Le but de using c'est de faire du bind ... Là vous voulez juste faire de l'exécution de SQL dynamique, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OPEN monCurseur;
    FETCH monCurseur BULK COLLECT INTO maCollection;
    CLOSE monCurseur;
    FORALL i IN INDICES OF maCollection
    EXECUTE IMMEDIATE maCollection(i).colonne1;

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    non ichi,
    c’était ce que j’avais essayé dès le départ mais cela génère une erreur de compilation PLS-00801: internal error .Avec le using , une autre erreur apparaît à l’exécution .
    Je donne raison à mnitu et je pense qu’on ne peut pas passer par un FORALL.

Discussions similaires

  1. [Oracle 9iR2][PL/SQL] EXECUTE IMMEDIATE USING
    Par mainecoon dans le forum Oracle
    Réponses: 4
    Dernier message: 08/02/2007, 19h08
  2. [PL/SQL] Execute immediate
    Par BiM dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/08/2005, 11h13
  3. Equivalents de EXECUTE IMMEDIATE ... RETURNING INTO ... ?
    Par swirtel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2005, 10h21
  4. [pl/sql] execute immediate
    Par Nadine dans le forum Oracle
    Réponses: 16
    Dernier message: 23/02/2005, 17h37
  5. Execute immediate et nom reserves
    Par nuke_y dans le forum Oracle
    Réponses: 3
    Dernier message: 22/11/2004, 18h17

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