Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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/06/2011, 20h39   #1
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 73
Points : 33
Points : 33
Par défaut Traiter ligne par ligne le résultat d'une requête en PL/SQL

Bonjour,

je voudrais traiter le résultat d'une requête select * from ..., ligne par ligne, et pour chaque ligne, réaliser une action.
Voici ci-dessous l'idée générale.
Merci de votre aide.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SET ServerOutput ON;
DECLARE
	cursor op_imap IS SELECT * nom_table  WHERE condition
BEGIN
	FOR i IN op_imap
	loop
		IF nom_champ IN SELECT nom_cham FROM nom_table2 WHERE condition1
		 Then
			action1 WHERE champ=nom_champ ;
		Else
			action2 WHERE champ=nom_champ ;
        End IF ;
 
	End loop ;  
END;
/
EXIT;
Decon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h30   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Pour l'utilisation d'un curseur dans un programme PL/SQL, tu peux te rapporter utilement à ce tutoriel
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h34   #3
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Bonjour,

Oui, un curseur fera l'affaire.

Est ce que tu as rencontré un problème?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 13h40   #4
Membre confirmé
 
Avatar de jkofr
 
Homme Jacques
Administrateur de base de données
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Nom : Homme Jacques
Âge : 43
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 219
Points : 219
Envoyer un message via MSN à jkofr
Je préfère éviter les curseurs quand je peux...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
CREATE OR REPLACE Procedure MyProc (pParam Varchar2)  AS
 TYPE         t_Char IS TABLE OF Varchar2(128);
 TYPE         t_Num IS TABLE OF Number;
 l_Name       t_Char;
 l_Age        t_Num;
Begin
 
 SELECT Name,Age
	 BULK COLLECT INTO  l_Name,l_Age
 FROM   MyTable
 WHERE  Dept = pParam;
 
 IF l_Name.FIRST IS NOT NULL then
  FOR i IN l_Name.FIRST..l_Name.LAST Loop
    -- Ton traitement ici !  
    dbms_output.Put_line ('Name = '||l_Name(i)||  '  Age  ='||l_Age(i));
  End LOOP;
 End IF;
 
End;
/
Ça c'est plus rapide il me semble. Maintenant attention a la taille de ta table...

Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g
Data Guard 11g, ASM & Grid Control 11g, Apex
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 17h13   #5
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par jkofr Voir le message
J
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Begin
 
 SELECT Name,Age
	 BULK COLLECT INTO  l_Name,l_Age
 FROM   MyTable
 WHERE  Dept = pParam;
 
 IF l_Name.FIRST IS NOT NULL then
  FOR i IN l_Name.FIRST..l_Name.LAST Loop
    -- Ton traitement ici !  
    dbms_output.Put_line ('Name = '||l_Name(i)||  '  Age  ='||l_Age(i));
  End LOOP;
 End IF;
 
End;
/
Jko
Bonjour,

Je voudrai juste savoir où se trouveraient le COMMIT et le ROLLBACK dans ce traitement de LOOP?

Bien Cordialement

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 17h39   #6
Membre confirmé
 
Avatar de jkofr
 
Homme Jacques
Administrateur de base de données
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Nom : Homme Jacques
Âge : 43
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 219
Points : 219
Envoyer un message via MSN à jkofr
Citation:
Envoyé par Mohamed.Houri Voir le message
Bonjour,

Je voudrai juste savoir où se trouveraient le COMMIT et le ROLLBACK dans ce traitement de LOOP?

Bien Cordialement

Mohamed Houri
Après le End If;

Mais suis d'accord que ca dépend du traitement...
Un commit ou un rollback dans la boucle te pose t'il un problème?

Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g
Data Guard 11g, ASM & Grid Control 11g, Apex
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 21h10   #7
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par jkofr Voir le message
Après le End If;

Mais suis d'accord que ca dépend du traitement...
Un commit ou un rollback dans la boucle te pose t'il un problème?

Jko
Bonsoir,

Il aurait fallut qu'ils y soit dans le code pour que je puisse vous dire s'ils me posent problème ou pas.

En attendant, puisque vous dites après le END IF c'est à dire en dehors de la LOOP, je dirai dans ce cas deux choses
(a) c'est OK pour le COMMIT
(b) j'aimerai avoir plus de détails sur le ROLLBACK


Bien cordialement

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 21h49   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Citation:
Envoyé par jkofr Voir le message
Je préfère éviter les curseurs quand je peux...
Ça c'est plus rapide il me semble. Maintenant attention a la taille de ta table...

Jko
Franchement, je ne vois pas l'intérêt, ni le gain de perf à passer par un tableau qui donc nécessite une affectation mémoire, puis un parcours.
Ca n'a d'utilité que si tu veux de la persistance de résultat pour plusieurs traitements.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 14h16   #9
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ben le bulk collect, ça diminue quand même les context switches...

Si j'ai bien compris, avant 10g, le cursor implicite ne fait pas de bulk (alors qu'après, oui)

http://asktom.oracle.com/pls/asktom/...:4696422878211

Par contre, si tu veux faire du bulk, il vaut mieux l'intégrer dans la boucle avec du :
Code :
1
2
3
 
OPEN...
FETCH ... BULK COLLECT... LIMIT 100
Et là, tu maîtrises ton allocation mémoire (vu que tu ne gagnes quasi rien à BULK COLLECT plus que 500 lignes)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann 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 02h05.


 
 
 
 
Partenaires

Hébergement Web