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

Oracle Discussion :

Execution d'une procedure stockée ds un script pl-sql


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut Execution d'une procedure stockée ds un script pl-sql
    Bonjour
    Alors que je fais mes débuts en programmation pl-sql (après avoir suivi un cours) , je dois exécuter une procédure stockée
    dans un script pl_sql dont voici un extrait pour simplifier :

    DECLARE
    w_requete varchar2(1000);

    BEGIN
    DBMS_OUTPUT.PUT_LINE('DEBUG - Je suis passé par là');
    execute MA_PROC;
    END;


    Et voila ce que j'ai comme message
    execute MA_PROC;
    *
    ERREUR à la ligne 8 :
    ORA-06550: line 8, column 10:
    PLS-00103: Encountered the symbol "MA_PROC" when expecting one of the
    following:
    := . ( @ % ; immediate
    The symbol ":=" was substituted for "MA_PROC" to continue.


    J'ai l'impression que c'est la commande execute qui pose problème alors que ça fonctionne bien sous sqlplus ou sql-developpeur

    Alors si quelqu'un pouvait me dire (je continue tout de mêm à chercher)
    Merci à tous

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    En effet, supprimez le EXECUTE qui est une commande SQL*Plus et non PL/SQL et ça devrait marcher.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Ok c'est bon mais j'ai un problème car je dois généré la requete (enfin l'exécution de cette proc en dynamyque puis l'exécuter avec execute dynamique (car je charge le nom du schéma en dynamique)
    w_requete := schemaMaj||'.MA_PROC'; (schemaMaj est une varaible alimentée auparavant)
    DBMS_OUTPUT.PUT_LINE ('requete a exécuter : '||w_requete);
    execute immediate w_requete;


    Et voilà l'injure !

    requete a exécuter : MON_SCHEMA.MA_PROC
    DECLARE
    *
    ERREUR à la ligne 1 :
    ORA-00900: invalid SQL statement
    ORA-06512: at line 21


    Alors que si j'excute l'instruction MON_SCHEMA.MA_PROC directement dans mon script PL SQL ça fonctionne
    j'ai le message suivant :
    Procédure PL/SQL terminée avec succès.

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Essayez plutôt:

    BEGIN
    mon_schema.ma_proc;
    END
    Mais pour changer dynamiquement de schéma vous pouvez aussi utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER SESSION SET CURRENT_SCHEMA = mon_schema;
    et ne pas préfixer les objets par le nom du schéma.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    quelle version ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Ca marche
    Merci

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    c est la version 9i
    En fait le nom de mes schemas à mettre à jour, je les récupère dans une table d'un schéma X (disons d'administration) via un curseur. Ce qui fait que je peux avoir 1 à n schema sur lesquels je dois exécuter cette procédure en fonction d'un certain nombre de critères.
    A priori le dynamique dans une boucle est la seul solution pour automatiser

    Pour un début en pl sql , c'est formateur
    En tout ca marche, merci à tous

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    J'ai répondu trop vite , ça marche dans la mesure ou je n'ai plus d'injures
    Mais la procédure ne s'éxécute pas.
    Je résume :
    J'ai un ensemble d'agents (500000 environ) que je charge dans une table Agent d'un schema "administration des autres schémas" :SchemaAdmin. Ensuite je dois dispacher ces agents dans différents schémas(schema1, schema2 , etc ça peut aller jusqu'à 50) en fonction d'une donnée disons le département d'affectation géographique.

    1- je lance ma procédure pl-sql à partir du schmaAdmin
    2- je récupère ds un curseur les schémas concernés
    3- Pour chaque schéma, j'insère mes agents dans la table Agent concernée (requete dynamique en fonction du schema)
    Et la tout va bien !! ça fonctionne
    4- Maintenant Pour chaque schéma, je dois executer un procédure stockée MaProc qui effectue un certain nbres de traitements pr lesquels je ne suis pas maitre puisqu'il s'agit d'un progiciel.
    Et là je n'arrive à exécuter cette maudite procédure via une requete dynamique (j'ai rajouté des infos suite à vos conseils et même un commit)

    Voici ma procédure
    DECLARE
    w_schema varchar(8);
    w_requete varchar2(1000);
    CURSOR schema_cursor IS
    select distinct Matable.shema from Matable,.......
    where ....;
    BEGIN
    OPEN schema_cursor;
    LOOP
    FETCH schema_cursor into w_schema;
    EXIT WHEN schema_cursor%NOTFOUND;
    w_requete := 'insert into '||w_schema||'.Agent (.....)
    (select ....)';
    EXECUTE IMMEDIATE w_requete;
    COMMIT;
    END LOOP;
    close schema_cursor;
    OPEN schema_cursor;
    LOOP
    FETCH schema_cursor into w_schema;
    EXIT WHEN schema_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE ('Debut execution procedure imp_agents du schéma : '||w_schemaMaj);
    w_requete := 'BEGIN '||w_schemaMaj||'.MaProc; COMMIT; END;';
    DBMS_OUTPUT.PUT_LINE ('requete a exécuter : '||w_requete);
    execute immediate w_requete;
    END LOOP;
    close schema_cursor;
    END;

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par padraig29
    w_requete := 'BEGIN '||w_schema||'.MaProc; COMMIT; END;';
    DBMS_OUTPUT.PUT_LINE ('requete a exécuter : '||w_requete);
    execute immediate w_requete;
    END LOOP;
    close schema_cursor;
    END;[/COLOR][/SIZE][/B]
    J'ai voulu changer mes noms de données pr que ce sois plus lisibles et j'ai oublié une ligne (en rouge) ; non il n'y a pas d'erreur de syntaxe.
    J'ai rajouté le 'commit' ds le bloc après sans grande conviction mais ça ne foncitonnait pas non plus avant.

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu peux utiliser la balise CODE s'il te plait ? (C'est le # dans les icones d'éditions de message).

    1/ C'est normal que tu lances 2 fois le même curseur ? Tu pourrais ne le lancer qu'une fois et dans la boucle lancer tes 2 procédures d'affilée.

    2/ Utilise des loop, ce sera plus lisible.

    3/ J'ai pas compris si une erreur était levée ou si rien ne se passait dans tes schémas.

    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
    DECLARE 
     
     w_requete VARCHAR2(1000);
     
    CURSOR schema_cursor IS
     SELECT DISTINCT MATABLE.shema AS schemaMaj 
     FROM MATABLE,.......
     WHERE ....;
     
    BEGIN
      FOR r IN schema_cursor
      LOOP
        w_requete := 'insert into '||r.schemaMaj||'.Agent (.....) (SELECT ....)';
        EXECUTE IMMEDIATE w_requete;
        DBMS_OUTPUT.PUT_LINE ('Insertion Agents dans schéma : '||r.schemaMaj || ' Nb:' || SQL%ROWCOUNT);
        COMMIT;
     
        DBMS_OUTPUT.PUT_LINE ('Imp_agents du schéma : '||r.schemaMaj);
        w_requete := 'BEGIN '||r.schemaMaj||'.MaProc; COMMIT; END;';
        DBMS_OUTPUT.PUT_LINE ('requete a exécuter : '||w_requete);
        EXECUTE IMMEDIATE w_requete; 
      END LOOP;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Merci pour la balise code. Je ne savais pas comment faire.
    Effectivement? j'aurais du mettre mes 2 requetes à la suite mais c'est un collègue qui m'a conseillé de faire comme ça (voir faire 2 scripts différents) pour des raisons de commit. J'ai donc suivi ses conseils mais j'avais l'intention de changer.
    Je n'ai plus d'erreurs depuis que j'ai rajouté le Begin END ds ma 2eme requete (appel de la proc) mais il ne s'y passe rien dans mes schémas alors que chacune des procédure traite en moyenne 9000 lignes et je traite 3 schémas en tout.
    Quelqu'un d'autre m'a dit que mes proc pouvaient s'éxécuter en différé Faudra que je vérifie cela.
    Pour l'instant j'ai cherché sur le net, ds certaine doc mais je n'ai rien trouvé de similaire à mon cas
    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
    DECLARE 
     
     w_requete VARCHAR2(1000);
     
    CURSOR schema_cursor IS
     SELECT DISTINCT MATABLE.shema AS schemaMaj 
     FROM MATABLE,.......
     WHERE ....;
     
    BEGIN
      FOR r IN schema_cursor
      LOOP
        w_requete := 'insert into '||r.schemaMaj||'.Agent (.....) (SELECT ....)';
        EXECUTE IMMEDIATE w_requete;
        DBMS_OUTPUT.PUT_LINE ('Insertion Agents dans schéma : '||r.schemaMaj || ' Nb:' || SQL%ROWCOUNT);
        COMMIT;
     
        DBMS_OUTPUT.PUT_LINE ('Imp_agents du schéma : '||r.schemaMaj); ==> s'affiche bien   Pour mes 3 boucles    w_requete := 'BEGIN '||r.schema||'.MaProc; COMMIT; END;';
        DBMS_OUTPUT.PUT_LINE ('requete a exécuter : '||w_requete);  => s'affiche bien pr les 3 boucles
        EXECUTE IMMEDIATE w_requete; 
      END LOOP;
    END;
    Et à la fin Message comme quoi le script s'est bien déroulé

  12. #12
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est bizarre en effet.

    Je ne pense pas que tu ais des problèmes de COMMIT vu que c'est la même session. C'est juste le schéma des données et des procédures qui changent.

    Je n'ai pas d'idée sur ce qui foire dans les SCHEMAS.MaProc
    Tout dépend du code. Si c'est du pragma autonomous faut commiter avant.
    Tu peux poster le code de MaProc d'un schéma ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. [VB.NET] Progress Bar et l'execution d'une procedure stockée
    Par messi1987 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/03/2014, 23h22
  2. Réponses: 5
    Dernier message: 10/03/2014, 18h02
  3. Arreter l'execution d'une procedure stockée asynchrone
    Par Naruto_kun dans le forum Langages
    Réponses: 1
    Dernier message: 10/12/2013, 09h00
  4. Réponses: 0
    Dernier message: 23/11/2009, 17h05
  5. [SQL-Server] Execution d'une procedure stockée SQL Serveur depuis PHP.
    Par gregb34 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/05/2006, 01h06

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