Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/07/2007, 14h30   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
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
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 14h34   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
En effet, supprimez le EXECUTE qui est une commande SQL*Plus et non PL/SQL et ça devrait marcher.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 15h11   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
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.
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 15h24   #4
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Essayez plutôt:

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

Code :
ALTER SESSION SET CURRENT_SCHEMA = mon_schema;
et ne pas préfixer les objets par le nom du schéma.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 15h26   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
quelle version ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 15h49   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
Ca marche
Merci
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 16h00   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
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
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 21h56   #8
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
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;
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2007, 08h31   #9
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
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.
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2007, 16h34   #10
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
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 :
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2007, 16h53   #11
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 49
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 49
Points : 14
Points : 14
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 :
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é
padraig29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2007, 16h00   #12
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h28.


 
 
 
 
Partenaires

Hébergement Web