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 06/07/2011, 11h48   #1
Invité régulier
 
Inscription : juillet 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 47
Points : 9
Points : 9
Par défaut Créer un curseur sous condition

Bonjour,
J'ai un traitement PL/SQL que je dois reprendre, malheureusement je ne m'y connais pas forcement.
Le traitement se fait sur le résultat d'un curseur CI.

Ce qu'il faut que je fasse c'est d'inclure dans le traitement certaines données en fonction d'un résultat sur un select. J'aimerais donc lier la déclaration de mon curseur au résultat d'une condition.

Ce qui donnerait un truc du style :
Code :
1
2
3
4
5
6
IF (SELECT count(*) FROM Matable <>0) then
    Cursor ci SELECT ....
Else
    Cursor ci Autre SELECT...
 
End IF;
Malheureusement je m'embrouille dans le placement de ces déclarations, dans le declare, dans le begin etc...

De plus je ne suis pas sur que l'on puisse mettre comme condition du if le résultat d'une requête.


Si quelqu'un peut m'éclairer sur la faisabilité de la chose et sur la façon de procéder ce serait super.

Merci d'avance
kalurar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h13   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

http://download.oracle.com/docs/cd/B..._statement.htm


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
DECLARE
  TYPE cursor_ref IS REF CURSOR;
  c1 cursor_ref;
  TYPE cur_tab IS TABLE OF varchar2(50);
  rec_tab cur_tab; 
 
  lv_query VARCHAR2(4000);
  lv_count NUMBER;
BEGIN
    SELECT 0 
    INTO lv_count
    FROM dual 
    ;
 
IF (lv_count > 0 ) then
    lv_query := ' ';
    lv_query := lv_query || ' SELECT ''TOTO'' ';
    lv_query := lv_query || ' FROM DUAL  ';
Else
    lv_query := ' ';
    lv_query := lv_query || ' SELECT ''TATA'' ';
    lv_query := lv_query || ' FROM DUAL ';
End IF;
 
  OPEN c1 FOR lv_query ;
  FETCH c1 BULK COLLECT INTO rec_tab; 
  FOR i IN rec_tab.first..rec_tab.last
  loop
      dbms_output.put_line(rec_tab(i));
  end loop;
 
END;
/
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h29   #3
Invité régulier
 
Inscription : juillet 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 47
Points : 9
Points : 9
Merci pour ta réponse,
J'ai effectivement trouvé des choses sur les curseurs dynamiques.
J'ai essayé de faire quelquechose comme ca et ca a l'air de marcher.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE OR REPLACE PROCEDURE IDXIMM.Exec IS
immtyp varchar(3);
    cursor ci (immtyp varchar) IS SELECT * FROM Ma_TABLE AND doctypimm <> immtyp;
 
    BEGIN
 
        immtyp :='STE';
 
         FOR cirec IN ci(immtyp) loop
            INSERT INTO W_EUREKA_TEST ...
          end loop;
 
 
 
 
END Exec;
/
Quelle est la différence avec ta solution ? En existe il une meilleur que l'autre ?
kalurar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h33   #4
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
Bonjour,

Généralement lorsque dans votre code PL/SQL il y a des instructions qui s'executent sur la base d'un select count, c'est qu'il y a forcément des choses à revoir. Le select count est généralement inutile dans ce cas

Sinon pour répondre à votre problème

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
DECLARE
 cursor c1 IS
 SELECT * FROM emp;
 
 cursor c2 IS
 SELECT * FROM dept;
 
BEGIN
 
  IF count(1) = 0 then
    open cursor c1;
  etc...
 else
   open cursor c2;
  etc...
 end IF;
 
 ....
Bien à vous

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 13h42   #5
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Avec cette syntaxe tu peux binder ton curseur.

De plus le BULK permet de limiter les switchs entre le moteur SQL et PL/SQL.

http://download.oracle.com/docs/cd/B...61/dynamic.htm
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
DECLARE 
 
   TYPE cursor_ref IS REF CURSOR;
   c1 cursor_ref;
   TYPE cur_tab IS TABLE OF varchar2(50);
   rec_tab cur_tab; 
 
    lv_query VARCHAR2(4000);
    immtyp :='STE';
 
BEGIN
 
    lv_query := ' ';
    lv_query := lv_query || ' SELECT * FROM Ma_TABLE ';
    lv_query := lv_query || ' WHERE doctypimm <> :1';
 
 
   OPEN c1 FOR lv_query USING immtyp ;
 
   FETCH c1 BULK COLLECT INTO rec_tab; 
   FOR i IN rec_tab.first..rec_tab.last
   loop
       dbms_output.put_line(rec_tab(i));
   end loop;
 
END;
/
On obtient de meilleurs performance avec cette syntaxe, évidemment si tu ne dois traiter que 3 lignes ....

cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 13h48   #6
Invité régulier
 
Inscription : juillet 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 47
Points : 9
Points : 9
Merci pour vos réponses,
@ Mohamed, j'avais pensé a une solution de ce style,
le probleme étant la maintenabilité.
En effet si le process est modifié, il faut appliquer la modif a chaque if, pas forcément l'idéal.

Je passe en résolu
kalurar 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 03h26.


 
 
 
 
Partenaires

Hébergement Web