Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 21/03/2008, 13h23   #1
Invité de passage
 
Inscription : mars 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 7
Points : 0
Points : 0
Par défaut FORALL + SQL Dynamique

Est il possible d'associer un FORALL avec du sql dynamique par exemple j'aimerais faire ceci:

Code :
1
2
3
4
5
6
7
8
9
10
PROCEDURE DeleteInTableForAll(
	pvNomTable	IN	VARCHAR2,
        ptId		     IN	   tTiD)
IS
...
BEGIN
vStmt:='DELETE '|| pvNomTable || ' WHERE  ftEdelId = :1';
FORALL i IN 1 .. ptId.COUNT  
	EXECUTE IMMEDIATE vStmt USING ptId(i);
END
Petite précision j'utilise une base Oracle 8i.

A priori j'ai une erreur de compilation lorsque je le fais. Est ce un probleme de version d'Oracle? Si oui n'y a t il pas un moyen de contourner cela?

Merci d'avance pour vos réponses.
isisiry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 13h31   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Avec FORALL, l'ordre SQL ne peut être que INSERT, UPDATE ou DELETE.

Lorsqu'il y a production de message d'erreur, merci d'éviter le jeu : devinez laquelle et sur quelle ligne !
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 13h54   #3
Invité de passage
 
Inscription : mars 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 7
Points : 0
Points : 0
Citation:
Envoyé par SheikYerbouti Voir le message
Avec FORALL, l'ordre SQL ne peut être que INSERT, UPDATE ou DELETE.

Lorsqu'il y a production de message d'erreur, merci d'éviter le jeu : devinez laquelle et sur quelle ligne !
Justement, SheikYerbouti, sur ce lien (très bon résumé en l'occurrence):
http://sheikyerbouti.developpez.com/execute_immediate/

Tu mets cet exemple:
FORALL i IN T_Id.first..T_Id.last
EXECUTE IMMEDIATE 'UPDATE emp SET sal = sal * 1.1 WHERE empno = :1 RETURNING ename INTO :2'
USING T_Id(i) RETURNING BULK COLLECT INTO T_Nom;

Que j'ai essayé de reproduire mais cela ne compile, alors je me suis dit que cela vient de la version Oracle(8i)?
ET j'aurais voulu trouvé une solution pour éviter d'écrire 36 fois la requete FORALL pour chaque table que je dois deleter !!!

Peut etre en avez vous une?
isisiry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h01   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Désolé, je n'avais pas vu le DELETE dans votre exemple.
Il est possible que cette syntaxe ne fonctionne pas en 8i. En tous cas, elle fonctionne parfaitement en 9.2.0
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h02   #5
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
je note également que c'est la 2ème fois que vous dites : "cela ne compile pas..."
J'imagine qu'il faudra payer pour avoir le message d'erreur...
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h08   #6
Invité de passage
 
Inscription : mars 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 7
Points : 0
Points : 0
Non non pas besoin de payer, voici l'erreur:

Citation:
Errors for PACKAGE BODY EDPK_PURGE_PRIVACY_ORC:

LINE/COL ERROR
-------- -----------------------------------------------------------------
157/4 PLS-00103: Encountered the symbol "EXECUTE" when expecting one of
the following:
. ( * @ % & - + / at mod rem select update <an exponent (**)>
delete insert ||
C'est quand même dommage que cela ne soit pas possible!

Je crois que je suis bon à écrire 36 fois le même code pour toute mes tables . A moins qu'il existe une solution miracle ...
isisiry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h16   #7
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Sinon, remplacez FORALL par une boucle For ... Loop standard. Vous perdrez juste en temps d'exécution.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h17   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par SheikYerbouti Voir le message
J'imagine qu'il faudra payer pour avoir le message d'erreur...
je crains que ce soit pareil pour espérer le voir utiliser les balises CODE et QUOTE

Il ne manquerait pas le LOOP dans son code ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h22   #9
Invité de passage
 
Inscription : mars 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 7
Points : 0
Points : 0


Justement, le but c'était d'utiliser la vitesse du FORALL. Tant pis
Merci de votre réactivité quand même.
isisiry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2008, 14h25   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par isisiry Voir le message
Est il possible d'associer un FORALL avec du sql dynamique par exemple j'aimerais faire ceci...
Petite précision j'utilise une base Oracle 8i.
...
Cette option n'est pas disponible en Oracle 8i, elle a été introduite en version 9.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h44.


 
 
 
 
Partenaires

Hébergement Web