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 :

Erreur procédure stocké d'archivage


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Erreur procédure stocké d'archivage
    Bien le bonjour à tous. Voila je dois réaliser une procédure stocké en pl sql qui permet d'archiver des informations obsolètes (fin de contrat et autres). Je vous mes le code, qui pour moi me semble juste (deux jours à plancher dessu sans succés) et les erreurs qui en découlent.

    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
    CREATE OR REPLACE PROCEDURE Archivage
    IS
            Date DATES%RowType DEFAULT SysDate;
            CURSOR Cu_Resident is (select * from Bateau B, Occuper O where B.NumB = O.NumB);
            CURSOR Cu_Stationnement is (select * from Stationner);
            order_dym varchar2(300);
    BEGIN
            FOR S IN Cu_Stationnement
            LOOP
                    IF((S.DUREE_S+to_char(S.VALEUR,'mm'))>to_char(Date, 'mm')) THEN
                            order_dym := 'INSERT INTO Ar_Stationnement (Valeur, Bassin, Ponton, Num_Emp, NumB, Duree_S)
                                        -- VALUES (' || S.Valeur || ',' || S.Bassin || ',' || S.Ponton || ',' || S.Num_Emp ||',' || S.NumB || ',' || S.Duree_S || ')';
                            EXECUTE IMMEDIATE order_dym;
                            order_dym := 'DELETE FROM Stationner WHERE Valeur=' || S.Valeur || ' and Bassin=' || S.Bassin || ' and Ponton=' || S.Ponton || ' 
                                         and Num_Emp=' || S.Num_Emp;
                            EXECUTE IMMEDIATE order_dym;
                    END IF;
            END LOOP;
     
            FOR R IN Cu_Resident
            LOOP
                    IF((R.DUREE_O+to_char(R.Valeur,'mm'))>to_char(Date,'mm')) THEN
                            order_dym := 'INSERT INTO Ar_Resident (NumB, Nom)
                                 VALUES (' || R.NumB || ',' || R.Nom || ')';
                            EXECUTE IMMEDIATE order_dym;
                            order_dym := 'DELETE FROM Bateau WHERE ' || R.NumB || '=NumbB and ' || R.Nom || '=Nom';
                            EXECUTE IMMEDIATE order_dym;
                    END IF;
            END LOOP;
    END;
    /

    et la réponse d'oracle
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    3/7 PL/SQL: Item ignored
    3/29 PLS-00382: expression du mauvais type
    10/3 PL/SQL: Statement ignored
    10/49 PLS-00320: déclaration de type de cette expression est
    incomplète ou mal structurée

    20/2 PL/SQL: Statement ignored
    20/2 PLS-00402: alias requis dans liste de curseur SELECT pour éviter
    noms de col. en double

    En espérant avoir posté au bon endroit.
    Merci de votre aide futur (du moins je l'espère).

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Bonjour.
    Ne serait-ce qu'en formatant le code, on y voit plus clair.
    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
    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
    CREATE OR REPLACE PROCEDURE archivage
    IS
       DATE        dates%ROWTYPE   DEFAULT SYSDATE;
     
       CURSOR cu_resident
       IS
          (SELECT *
             FROM bateau b, occuper o
            WHERE b.numb = o.numb);
     
       CURSOR cu_stationnement
       IS
          (SELECT *
             FROM stationner);
     
       order_dym   VARCHAR2 (300);
    BEGIN
       FOR s IN cu_stationnement
       LOOP
          IF ((s.duree_s + TO_CHAR (s.valeur, 'mm')) > TO_CHAR (DATE, 'mm'))
          THEN
             order_dym :=
                   'INSERT INTO Ar_Stationnement (Valeur, Bassin, Ponton, Num_Emp, NumB, Duree_S) VALUES ('
                || s.valeur
                || ','
                || s.bassin
                || ','
                || s.ponton
                || ','
                || s.num_emp
                || ','
                || s.numb
                || ','
                || s.duree_s
                || ')';
     
             EXECUTE IMMEDIATE order_dym;
     
             order_dym :=
                   'DELETE FROM Stationner WHERE Valeur='
                || s.valeur
                || ' and Bassin='
                || s.bassin
                || ' and Ponton='
                || s.ponton
                || 'and Num_Emp='
                || s.num_emp;
     
             EXECUTE IMMEDIATE order_dym;
          END IF;
       END LOOP;
     
       FOR r IN cu_resident
       LOOP
          IF ((r.duree_o + TO_CHAR (r.valeur, 'mm')) > TO_CHAR (DATE, 'mm'))
          THEN
             order_dym :=
                'INSERT INTO Ar_Resident (NumB, Nom) VALUES (' || r.numb || ',' || r.nom
                || ')';
     
             EXECUTE IMMEDIATE order_dym;
     
             order_dym :=
                    'DELETE FROM Bateau WHERE ' || r.numb || '=NumbB and ' || r.nom || '=Nom';
     
             EXECUTE IMMEDIATE order_dym;
          END IF;
       END LOOP;
    END;
    /
    Dès le départ, ceci est étrange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (s.duree_s + TO_CHAR (s.valeur, 'mm')) > TO_CHAR (DATE, 'mm')
    Additionner et comparer des chaînes de caractères n'est jamais bon.
    Quels sont les descriptions de vos tables?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    ah merci je sais pas trop comment on met en form sur le forum ^^


    Sur le bou de code que tu as cité on essaye de comparer les mois de deux dates. Si s.valeur (qui est comparable à sysdate) + s_duree (durée en mois) est supérieux au mois de DATE on archive le tuple.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par SixtyOne Voir le message
    ah merci je sais pas trop comment on met en form sur le forum ^^
    J'ai effectué le formatage sous Toad, rien à voir avec le forum.

    Citation Envoyé par SixtyOne Voir le message
    Sur le bou de code que tu as cité on essaye de comparer les mois de deux dates. Si s.valeur (qui est comparable à sysdate) + s_duree (durée en mois) est supérieux au mois de DATE on archive le tuple.
    Si vous voulez comparer des mois, il vous faut des mois de chaque côté.

    Je verrais quelque chose comme cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_NUMBER (TO_CHAR ((s.duree_s + s.valeur), 'mm') ) > TO_NUMBER (TO_CHAR (DATE, 'mm'))
    A gauche, vous ajoutez d'abord la durée à la date, et ensuite vous regardez le mois.

    NB: là, je compare strictement les mois, sans tenir compte de l'année. Donc janvier 2009 équivaut à 1 et décembre 2008 équivaut à 12.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    ok merci de ta réponse ^^

  6. #6
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    J'ai effectué le formatage sous Toad, rien à voir avec le forum.


    Si vous voulez comparer des mois, il vous faut des mois de chaque côté.

    Je verrais quelque chose comme cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_NUMBER (TO_CHAR ((s.duree_s + s.valeur), 'mm') ) > TO_NUMBER (TO_CHAR (DATE, 'mm'))
    A gauche, vous ajoutez d'abord la durée à la date, et ensuite vous regardez le mois.

    NB: là, je compare strictement les mois, sans tenir compte de l'année. Donc janvier 2009 équivaut à 1 et décembre 2008 équivaut à 12.
    Pour comparer des mois (en tenant compte de l'année !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TRUNC (ADD_MONTHS(s.duree_s,s.valeur),'MM')>trunc(dDate,'MM')
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    La réponse à tes erreurs Oracle :

    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    3/7 PL/SQL: Item ignored
    3/29 PLS-00382: expression du mauvais type
    10/3 PL/SQL: Statement ignored
    10/49 PLS-00320: déclaration de type de cette expression est
    incomplète ou mal structurée
    Je ne sais pas trop où cela se situe, mais cette partie m'a choqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Date DATES%RowType DEFAULT SysDate;
    1: Il ne faut pas utiliser de noms de variables réservées oracle (DATE)
    2: C'est quoi DATES ?
    3: Utiliser un Rowtype, initialisé avec une seule donnée : Sysdate
    Bref, vu le code, ce serait plutôt cette déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_date DATE := SYSDATE;
    20/2 PL/SQL: Statement ignored
    20/2 PLS-00402: alias requis dans liste de curseur SELECT pour éviter
    noms de col. en double
    Le message est clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Bateau B, Occuper O WHERE B.NumB = O.NumB
    Comment accéder aux 2 NumB ramenés par la requête. Oracle ne le peut pas. Il faut ramener chaque colonne que tu utilises, les préfixer des alias (et les renommer si jamais tu dois ramener 2 colonnes ayant le même nom)

    En règle générale : Eviter de mettre des * dans les SELECT d'un curseur, de vues, etc..

    Autre chose : Pourquoi du sql dynamique ?
    Le code passe très bien en SQL standard.

    De plus si jamais tu dois toujours utiliser du dynamique, pense aux bind variables.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. erreur procédure stockée
    Par ChronosXIII dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/03/2009, 10h31
  2. Réponses: 0
    Dernier message: 04/02/2009, 12h26
  3. Erreur Procédure Stockée et ASP
    Par dedein84 dans le forum ASP
    Réponses: 1
    Dernier message: 08/08/2008, 14h21
  4. Erreur procédure stockée : curseur read only
    Par Oluha dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/11/2005, 09h50
  5. erreur Procédure stockée
    Par Invité dans le forum SQL
    Réponses: 5
    Dernier message: 17/12/2004, 14h09

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