IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Curseur nom de table


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué Avatar de jlm22
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2010
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 203
    Points : 148
    Points
    148
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Pourquoi faire simple quand on peut faire .......... compliqué

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Si le nom de la table n'est pas connu au moment de la compilation vous devez employer le Sql Dynamique

  3. #3
    Membre habitué Avatar de jlm22
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2010
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

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


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    Pourquoi faire simple quand on peut faire .......... compliqué

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Si vos colonnes DCarton sont de type date, vous pouvez faire beaucoup plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE DCarton < sysdate
      AND DCarton > sysdate - C1r.periodicite;
    Après peut-être que les bornes peuvent être incluses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. [MS SQL SERVER 2k5]nom de table dynamique dans un curseur
    Par patriceharel dans le forum Développement
    Réponses: 2
    Dernier message: 16/12/2008, 11h03
  3. Curseur et noms de tables en argument
    Par bliml dans le forum PL/SQL
    Réponses: 2
    Dernier message: 21/09/2008, 15h50
  4. curseur sur une table dont on ne connaît pas le nom
    Par NPortmann dans le forum Oracle
    Réponses: 4
    Dernier message: 12/07/2005, 09h04
  5. noms des tables d'une base
    Par molto dans le forum SQL
    Réponses: 2
    Dernier message: 17/03/2003, 22h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo