|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
En effet, supprimez le EXECUTE qui est une commande SQL*Plus et non PL/SQL et ça devrait marcher.
|
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
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. |
|
|
00
|
|
|
#4 | |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Essayez plutôt:
Citation:
Code :
ALTER SESSION SET CURRENT_SCHEMA = mon_schema; |
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
quelle version ?
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
Ca marche
Merci |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
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 |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
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; |
|
|
00
|
|
|
#9 | |
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
Citation:
J'ai rajouté le 'commit' ds le bloc après sans grande conviction mais ça ne foncitonnait pas non plus avant. |
|
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
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 :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
00
|
|
|
#11 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2006 Messages : 49 ![]() |
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 :
|
||
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com