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 16/05/2011, 12h11   #1
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
Par défaut Curseur nom de table

Bonjour,

j'utilise un curseur qui parcours une table, cette table contient des nom de table et une périodicité.

Voici ma procédure qui utilise le curseur :

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
 
CREATE OR REPLACE PROCEDURE Histo_Kcarton
IS
 
v_Periodicite     number;
 
cursor C1 IS
	   SELECT Ltable,periodicite
	   FROM histo;
C1r	   C1%ROWTYPE;
 
 
BEGIN
 
OPEN C1;
    FETCH C1 INTO C1r;
    -- on parcours la table Histo
    while C1%FOUND loop
        -- Récupération de la periodicite
        SELECT Periodicite INTO v_Periodicite
        FROM Histo
        WHERE ltable = C1r.Ltable;
 
        -- on supprime les anciennes saisies
        DELETE FROM C1r.Ltable 
        WHERE to_date(DCarton,'YYYY/MM/DD') <TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD'),'YYYY/MM/DD') 
        AND to_date(DCarton,'YYYY/MM/DD') > TO_DATE(TO_CHAR((sysdate - C1r.periodicite),'YYYY/MM/DD'),'YYYY/MM/DD');
        commit;
 
        -- on met à jour BDE Histo
        INSERT INTO C1r.Ltable
        SELECT * FROM KCarton@bdepkg0
        WHERE to_date(DCarton,'YYYY/MM/DD') <TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD'),'YYYY/MM/DD') 
        AND to_date(DCarton,'YYYY/MM/DD') > TO_DATE(to_char((sysdate - C1r.periodicite),'YYYY/MM/DD'),'YYYY/MM/DD');
        commit;
    FETCH C1 INTO C1r;
    end loop;
CLOSE C1;
END;
/
SHOW errors;
/

et voici ce qui pose problème J'aimerais savoir si c'est correct je viens tout juste de commencer le PL/SQL.

Au passage voici les message d'erreur, rien de très impressionant table ou vue inexistante

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
 
SQL> @c:\oracle\script
 
Avertissement : ProcÚdure crÚÚe avec erreurs de compilation.
 
Erreurs pour PROCEDURE HISTO_KCARTON :
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
23/9     PL/SQL: SQL Statement ignored
23/25    PL/SQL: ORA-00942: TABLE ou vue inexistante
29/9     PL/SQL: SQL Statement ignored
29/25    PL/SQL: ORA-00942: TABLE ou vue inexistante
 
Avertissement : ProcÚdure crÚÚe avec erreurs de compilation.
 
SQL> @c:\oracle\script
 
Avertissement : ProcÚdure crÚÚe avec erreurs de compilation.
Cordialement
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 14h16   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
Si le nom de la table n'est pas connu au moment de la compilation vous devez employer le Sql Dynamique
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 14h43   #3
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
Okay, j'ai utilisé execute immediate et j'ai concaténé mes variables sa a l'air de fonctionner :


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
 
CREATE OR REPLACE PROCEDURE Histo_Kcarton
IS
 
v_Periodicite   number;
v_table		  	varchar2(20);
v_requete		varchar2(100);
 
cursor C1 IS
	   SELECT Ltable,periodicite
	   FROM histo;
C1r	   C1%ROWTYPE;
 
 
BEGIN
 
OPEN C1;
    FETCH C1 INTO C1r;
    -- on parcours la table Histo
    while C1%FOUND loop
        -- Récupération de la periodicite
        SELECT Periodicite INTO v_Periodicite
        FROM Histo
        WHERE ltable = C1r.Ltable;
 
        v_table := C1r.Ltable;
 
        -- on supprime les anciennes saisies
        v_requete := 'delete from '|| v_table ||' where to_date(DCarton,''YYYY/MM/DD'') <TO_DATE(TO_CHAR(SYSDATE,''YYYY/MM/DD''),''YYYY/MM/DD'') And to_date(DCarton,''YYYY/MM/DD'') > TO_DATE(TO_CHAR((sysdate - ' || C1r.periodicite ||'),''YYYY/MM/DD''),''YYYY/MM/DD'') ';
        EXECUTE IMMEDIATE v_requete; 
        commit;
 
        -- on met à jour BDE Histo
        v_requete := ' insert into '|| v_table ||' select * from KCarton@bdepkg0 where to_date(DCarton,''YYYY/MM/DD'') < TO_DATE(TO_CHAR(SYSDATE,''YYYY/MM/DD''),''YYYY/MM/DD'') And to_date(DCarton,''YYYY/MM/DD'') > TO_DATE(to_char((sysdate - '|| C1r.periodicite ||'),''YYYY/MM/DD''),''YYYY/MM/DD'')';
        EXECUTE IMMEDIATE v_requete;    
        commit;
    FETCH C1 INTO C1r;
    end loop;s
CLOSE C1;
END;
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 18h34   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Si vos colonnes DCarton sont de type date, vous pouvez faire beaucoup plus court :
Code :
1
2
WHERE trunc(DCarton, 'D') < trunc(sysdate, 'D')
  AND trunc(DCarton, 'D') > trunc(sysdate, 'D') - C1r.periodicite;
Même si votre colonne DCarton est en char, on peut raccourcir :
Code :
1
2
WHERE to_date(DCarton, 'YYYY/MM/DD') < trunc(sysdate, 'D')
  AND to_date(DCarton, 'YYYY/MM/DD') > trunc(sysdate, 'D') - C1r.periodicite;
Et je ne suis pas sûr que les trunc soient nécessaire (ils suppriment la composante heures / minutes / secondes du format de date), comme apparemment vous désirez supprimer de vieilles données, ceci peut suffire :
Code :
1
2
WHERE DCarton < sysdate
  AND DCarton > sysdate - C1r.periodicite;
Après peut-être que les bornes peuvent être incluses :
Code :
WHERE DCarton BETWEEN sysdate - C1r.periodicite AND sysdate;
Notez que sur ces deux derniers points, ce sont vos données qui peuvent infirmer ou affirmer ces propositions.
__________________
Email : http://scr.im/waldar
Waldar est actuellement 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 12h02.


 
 
 
 
Partenaires

Hébergement Web