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 lors d'une éxécution d'une procédure dans un package SQL


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Erreur lors d'une éxécution d'une procédure dans un package SQL
    Bonjour,

    J'ai créé un package avec une seule procédure pour le moment.
    J'ai exécuté le package spec et body sans problème et au moment de l’exécution on me donne une erreur que je ne comprends pas :
    Erreur commençant à la ligne 52 de la commande :
    begin
    FA_PURGE.PurgerSI;
    end;
    Rapport d'erreur :
    ORA-00904: "DATEFIN": invalid identifier
    ORA-06512: at "DEV_SI.FA_PURGE", line 28
    ORA-06512: at line 2
    00904. 00000 - "%s: invalid identifier"
    *Cause:
    *Action:
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create or replace
    PACKAGE  FA_PURGE AS
    PROCEDURE  Purger_SI;
     END FA_PURGE ;
    /
    exit;
    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
    create or replace
    PACKAGE BODY FA_PURGE    as
    PROCEDURE Purger_SI;
    is
    -- Déclaration des variables de la fonction
        dateFin     DATE;
     
        nbAttDate    NUMBER := 0;
     delai NUMBER := 36;
     
    BEGIN
         --  Initialisation de la date de purge
        select retention into delai
          from PARAM_PURGE;
       dateFin := ADD_MONTHS(sysdate,-delai);
        SELECT distinct COUNT (*)
            INTO nbAttDate
            FROM DE_ETAT
             WHERE DATE_ETAT <  dateFin;
     
     
      EXECUTE IMMEDIATE 'create global temporary table id_purger 
        ON COMMIT PRESERVE ROWS 
         as
         SELECT distinct id_dec
         FROM DE_ETAT
         WHERE DATE_ETAT < dateFin ';
     
    commit;
    END Purger_SI;
    END FA_PURGE;
    /
    exit;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin 
    FA_PURGE.Purger_SI; 
    end; /


    Est-il possible de m'aider ? C'est la 1ére fois je fais du PL/SQL Oracle et je galère pas mal...
    MErci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Lorsque tu exécutes ta requête avec EXECUTE IMMEDIATE, la valeur de ta variable dateFin n'est pas accessible et l'interpréteur cherche une colonne portant ce nom.

    Ce qu'il te faut faire, c'est construire ta requête en y insérant la valeur de ta variable.
    Comme cela, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    WHERE DATE_ETAT < TO_DATE(' || TO_CHAR(dateFin) || ')';
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Une autre manière de faire est de créer la table avant de la remplir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    EXECUTE IMMEDIATE 
        'CREATE GLOBAL TEMPORARY TABLE id_purger 
            ON COMMIT PRESERVE ROWS 
        AS  SELECT  id_dec
            FROM    de_etat
            WHERE   1 = 0';
    INSERT INTO id_purger (id_dec)
    SELECT DISTINCT id_dec
    FROM    de_etat
    WHERE   date_etat < dateFin;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je pense que la 1ere erreur est de générer la GTT dans le code.
    Il est préférable de créer cette GTT en dur une fois pour toute, si toute fois sa création est nécessaire, puis de l'utiliser dans le code.

Discussions similaires

  1. [AC-2010] Message d'erreur lors de l'éxécution d'une requête
    Par Pittouti dans le forum Modélisation
    Réponses: 0
    Dernier message: 08/05/2013, 11h04
  2. message d'erreur lors de l'éxécution d'une procedure
    Par khalid76 dans le forum Développement
    Réponses: 4
    Dernier message: 08/10/2012, 11h07
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Réponses: 10
    Dernier message: 07/08/2008, 09h09
  5. [vb.net] erreur lors de l'éxécution d'une classe
    Par os_rasta dans le forum VB.NET
    Réponses: 10
    Dernier message: 01/12/2005, 18h34

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