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 17/09/2008, 09h55   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2006
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 60
Points : 10
Points : 10
Par défaut Curseur avec requête en variable

Bonjour,

Je travaille sur Oracle 9i et je cherche à faire un curseur avec une requete variable.

J'ai déja fait quelques recherches et ça donnerait quelques choses comme ça mais ça ne passe pas.

-------------------------------------------------------------------
declare

TYPE curseur_curtype is REF CURSOR RETURN matable%ROWTYPE;

curseur_curvar curseur_curtype;

curseur_rec matable%ROWTYPE;

marequete varchar2(500) ;

begin

marequete := 'select * from matable where xxx = 25';

OPEN curseur_curvar FOR EXECUTE marequete;

fetch curseur_curvar into curseur_rec;

close curseur_curvar;

end;
-------------------------------------------------------------------

Quelqu'un connait il la syntaxe exacte.

Merci par avance.
Pacman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 10h05   #2
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Salut, voilà une procédure que j'ai fait avec un curseur paramétré :

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
CREATE OR REPLACE PROCEDURE Abo_Churn_Regroupe_Email
IS
 
 
v_debut date;
v_fin date;
 
   --Déclaration d'un nouveau type
   type type_tab_email IS TABLE of ABO_CHURN_LOGIN_CAS.EMAIL%type;
   type type_tab_debut IS TABLE of  ABO_CHURN_LOGIN_CAS.DEBUT%type;
   type type_tab_fin IS TABLE of  ABO_CHURN_LOGIN_CAS.FIN%type;
   type type_tab_portail IS TABLE of  ABO_CHURN_LOGIN_CAS.PORTAIL%type;
 
   --Déclaration variable du nouveau type
   tab_email type_tab_email;
   tab_debut type_tab_debut;
   tab_fin type_tab_fin;
   tab_portail type_tab_portail;
 
   --Déclaration des curseurs
   cursor c_logins_abonnes IS
        SELECT UNIQUE email
        FROM ABO_CHURN_LOGIN_CAS 
        ORDER BY email;
   cursor c_ses_emails (un_email VARCHAR2) IS
        SELECT a.debut, a.fin, a.portail
        FROM ABO_CHURN_LOGIN_CAS a
        WHERE a.email = un_email
        ORDER BY a.email, a.debut;
 
   jour               CONSTANT INTEGER := 1;
   delai_regroupement CONSTANT INTEGER := 30 * jour;
   nb_insert integer;
 
BEGIN
 
v_debut := sysdate;
nb_insert := 0;
 
   -- on vide la table
   DELETE ABO_CHURN_EMAIL_CAS;
 
   --Utilisation du premier curseur
   open c_logins_abonnes;
   fetch c_logins_abonnes bulk collect INTO tab_email;
   close c_logins_abonnes;
 
   IF tab_email.first IS NOT NULL then
 
       FOR login_abonne IN tab_email.first..tab_email.last LOOP
            DECLARE
                nb_lignes_regroupées        INTEGER;
                premiere_ligne                BOOLEAN := TRUE;
                debut_regroupement_courant    DATE := NULL;
                fin_regroupement_courant       DATE := NULL;
                portail_courant                ABO_CHURN_LOGIN_CAS.PORTAIL%TYPE:=NULL;
 
            BEGIN
 
                --Utilisation du deuxième curseur
                open c_ses_emails(tab_email(login_abonne));
                fetch c_ses_emails bulk collect INTO tab_debut, tab_fin, tab_portail;
                close c_ses_emails;
 
                nb_lignes_regroupées    := 0; 
 
                IF tab_debut.first IS NOT NULL then
 
                    IF tab_debut.count <> 0 then
 
                        FOR un_email IN tab_debut.first..tab_debut.last LOOP
 
                            -- DBMS_OUTPUT.PUT_LINE ('D : '||un_email.debut||' F : '||un_email.fin||' debut_regroupement_courant : '|| debut_regroupement_courant|| ' fin_regroupement_courant : '|| fin_regroupement_courant|| ' nb_regroupement : '|| nb_lignes_regroupées|| ' DEBUT');
                            IF premiere_ligne THEN
 
                                -- On teste si le curseur parcourt la 1e ligne d'un groupe
                                premiere_ligne := FALSE;
                                -- On initialise les variables de début et de fin du regroupement courant
                                debut_regroupement_courant := tab_debut(un_email);
                                fin_regroupement_courant := tab_fin(un_email);
                                nb_lignes_regroupées := 1;
                                -- DBMS_OUTPUT.PUT_LINE ('D : '||un_email.debut||' F : '||un_email.fin||' debut_regroupement_courant : '|| debut_regroupement_courant|| ' fin_regroupement_courant : '|| fin_regroupement_courant|| ' nb_regroupement : '|| nb_lignes_regroupées|| ' 1e ligne groupe');
 
                            ELSE
                                -- Ce n'est pas une première ligne
                                IF tab_debut(un_email) - fin_regroupement_courant < delai_regroupement THEN
 
                                    -- Pas de rupture => On regroupe
 
                                    -- On prend le min de la date de début du regroupement courant et de la date de début lue (cas où les abonnements sont englobés)
                                    debut_regroupement_courant := LEAST(debut_regroupement_courant, tab_debut(un_email));
 
                                    -- On prend le max de la date de fin du regroupement courant et de la date de fin lue (cas où les abonnements sont englobés)
                                    fin_regroupement_courant := GREATEST(fin_regroupement_courant, tab_fin(un_email));
 
                                    -- Ne pas oublier de compter le regroupement                        
                                   nb_lignes_regroupées := nb_lignes_regroupées + 1;
 
                                ELSE
 
                                    -- Rupture, on enregistre le groupe courant.
                                    -- DBMS_OUTPUT.PUT_LINE ('D : '||un_email.debut||' F : '||un_email.fin||' debut_regroupement_courant : '|| debut_regroupement_courant|| ' fin_regroupement_courant : '|| fin_regroupement_courant|| ' nb_regroupement : '|| nb_lignes_regroupées|| ' AVANT INSERT MILIEU');
                                    INSERT INTO ABO_CHURN_EMAIL_CAS VALUES (tab_email(login_abonne), debut_regroupement_courant, fin_regroupement_courant, tab_portail(un_email), nb_lignes_regroupées, 'MILIEU');
                                    nb_insert := nb_insert + 1;
                                    -- Et on ouvre le groupe suivant à partir de la ligne de rupture
                                    debut_regroupement_courant := tab_debut(un_email);
                                    fin_regroupement_courant := tab_fin(un_email);
                                    nb_lignes_regroupées := 1;
                                    -- DBMS_OUTPUT.PUT_LINE ('D : '||un_email.debut||' F : '||un_email.fin||' debut_regroupement_courant : '|| debut_regroupement_courant|| ' fin_regroupement_courant : '|| fin_regroupement_courant|| ' nb_regroupement : '|| nb_lignes_regroupées|| ' APRES INSERT MILIEU');    
                                END IF;
 
                            END IF;
                            -- Passage des variables locales à la sortie de la boucle
                            portail_courant:= tab_portail(un_email);                
 
                        END LOOP;
 
                   end IF;
 
                end IF;
 
                -- DBMS_OUTPUT.PUT_LINE (' debut_regroupement_courant : '|| debut_regroupement_courant|| ' fin_regroupement_courant : '|| fin_regroupement_courant|| ' nb_regroupement : '|| nb_lignes_regroupées|| ' DERNIER');
                INSERT INTO ABO_CHURN_EMAIL_CAS VALUES (tab_email(login_abonne), debut_regroupement_courant, fin_regroupement_courant, portail_courant, nb_lignes_regroupées, 'DERNIER');
                nb_insert := nb_insert + 1;
            END;
 
       END LOOP;
 
   end IF;
 
    v_fin := sysdate;
 
    INSERT INTO log_churns (debut, fin, duree, description) 
    VALUES (v_debut, v_fin, cast(v_fin AS timestamp) - cast(v_debut AS timestamp), 'regroupe email avec '|| nb_insert||' lignes insérées');
 
 
   COMMIT;
END Abo_Churn_Regroupe_Email;
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 10h19   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2006
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 60
Points : 10
Points : 10
Ce n'est pas un paramètre que je veux passer au curseur, ça je sais le faire mais c'est la requete que je veux construire et passer en parametre au curseur. Ma requête va être différente en fonction de mon traitement précédent.

Merci quand même.
Pacman23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 10h28   #4
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Désolé j'avais mal compris ta question, hi hi hi
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 10h30   #5
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 Pacman23 Voir le message
...
Quelqu'un connait il la syntaxe exacte.

Merci par avance.
Le Sql dynamique
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 13h13   #6
Invité régulier
 
Inscription : août 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 31
Points : 9
Points : 9
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
-- Déclaration
CCRS      SYS_REFCURSOR;    -- CURSEUR DYNAMIQUE
CHAMPS1  VARCHAR2(50)        -- Un des champs retournés par la requete dynamique
CHAMPS2  VARCHAR2(50)        -- Un des champs retournés par la requete 
REQ        VARCHAR2(1000);   -- la variable requete dans un char
-- Execution
BEGIN
   REQ := 'SELECT Nom, Prenom FROM MesPotes';
   OPEN CCRS FOR REQ; -- EXECUTE LA REQUETE
   LOOP -- BOUCLE SUR LE RESULTAT DE LA REQUETE
      FETCH CCRS INTO CHAMPS1, CHAMPS2; -- BASCULE LES DONNÉES DE LA REQUETE DANS LES VALEURS DÉCLARÉS
      EXIT WHEN CCRS%NOTFOUND; -- Je sors si le resultat de la requete est vide ou si je suis sur la dernière occurrence
      DBMS_OUTPUT.PUT_LINE(CHAMPS); -- J'affiche le contenue du champs
   END LOOP;
END
Scrouik 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 05h56.


 
 
 
 
Partenaires

Hébergement Web