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 :

Problème variable numérique dans requête


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 38
    Points : 30
    Points
    30
    Par défaut Problème variable numérique dans requête
    Bonjour à tous,
    j'ai un léger soucis avec 2 petites procédures PL/SQL.
    En fait, ma première procédure, va chercher une date dans une table > créer une table temporaire > stocke la date dans cette table > et update la date dans la table principale :
    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
    CREATE OR REPLACE PROCEDURE SCHEMA.P_DATE_CHECKPOINT
    IS
        s#QUERY_SEL_DATE DATE;
        s#DATE_TMP DATE;    
    BEGIN
        s#DATE_TMP:= '01/01/1900';
        s#QUERY_SEL_DATE:=
                           'SELECT CP.LAST_RUN_DATE
                            FROM CHECK_POINT CP
                            WHERE CP.CP_ID =  5';
     
        EXECUTE IMMEDIATE 'CREATE TABLE CHECK_POINT_TMP (LAST_RUN_DATE DATE)';
        EXECUTE IMMEDIATE 'INSERT INTO CHECK_POINT_TMP (LAST_RUN_DATE)
                           VALUES ('|| s#QUERY_SEL_DATE ||')';
        EXECUTE IMMEDIATE 'UPDATE CHECK_POINT CP
                           SET LAST_RUN_DATE = '|| s#DATE_TMP ||
                           'WHERE CP.CP_ID = 5';
    END;
    /
    Et ma 2ème procédure va récupère la date stockée dans la table temporaire > la met à la place de la date de la table principale > et supprime la table temporaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE PROCEDURE SCHEMA.P_CHECKPOINT_INITIAL_DATE
    IS
        s#QUERY_SEL_DATE_TMP DATE;
    BEGIN
        s#QUERY_SEL_DATE_TMP:=
                           'SELECT CPT.LAST_RUN_DATE
                                FROM CHECK_POINT_TMP CPT';
        EXECUTE IMMEDIATE 'UPDATE CHECK_POINT CP
                           SET LAST_RUN_DATE = '|| s#QUERY_SEL_DATE_TMP
                           || 'WHERE CP.CP_ID = 5';
        EXECUTE IMMEDIATE 'DROP TABLE CHECK_POINT_TMP';
    END;
    /
    Lorsque je créer ces proc, pas de soucis, mais lorsque j'essaie de les executer, j'ai cette erreur (la même pour les 2), voici celle de la première :

    ORA-01858: Caractère non numérique trouvé à la place d'un caractère numérique
    ORA-06512: à "SCHEMA.P_DATE_CHECKPOINT", ligne 7
    ORA-06512: à ligne 1


    Quelqu'un peut-il m'aider? Je ne sais pas si j'ai vraiment fait une erreur ou bien si c'est une histoire de quote mal placée ou manquante...

  2. #2
    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
    Pas de sql dynamique pour du DML !!!
    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
     
     
    CREATE OR REPLACE PROCEDURE SCHEMA.P_CHECKPOINT_INITIAL_DATE
    IS   
     s#QUERY_SEL_DATE_TMP DATE;
    BEGIN    
    SELECT CPT.LAST_RUN_DATE    
     INTO  s#QUERY_SEL_DATE_TMP DATE
    FROM CHECK_POINT_TMP CPT;
    UPDATE CHECK_POINT CP
    SET LAST_RUN_DATE = s#QUERY_SEL_DATE_TMP
    WHERE CP.CP_ID = 5;
    EXECUTE IMMEDIATE 'DROP TABLE CHECK_POINT_TMP';
    END;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Merci pour ta réponse rapide.
    Malheureusement, je n'ai toujours pas réussi , désolé je débute...
    Ma 1ère proc est maintenant comme cela :
    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
    CREATE OR REPLACE PROCEDURE SCHEMA.P_DATE_CHECKPOINT
    IS
        s#QUERY_SEL_DATE DATE;
        s#DATE_TMP DATE;    
    BEGIN
        s#DATE_TMP:= '01/01/1900';
        SELECT CP.LAST_RUN_DATE
        INTO s#QUERY_SEL_DATE DATE
        FROM CHECK_POINT CP
        WHERE CP.CP_ID = 5;
     
        CREATE TABLE CHECK_POINT_TMP (LAST_RUN_DATE DATE);
        INSERT INTO CHECK_POINT_TMP (LAST_RUN_DATE)
        VALUES (s#QUERY_SEL_DATE);
        UPDATE CHECK_POINT CP
        SET LAST_RUN_DATE = s#DATE_TMP
        WHERE CP.CP_ID = 5;
    END;
    /
    Et ma 2ème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE PROCEDURE APOLLO_REP_FR.P_CHECKPOINT_INITIAL_DATE_test
    IS   
        s#QUERY_SEL_DATE_TMP DATE;
    BEGIN    
        SELECT CPT.LAST_RUN_DATE    
        INTO  s#QUERY_SEL_DATE_TMP DATE
        FROM CHECK_POINT_TMP CPT;
        UPDATE CHECK_POINT CP
        SET LAST_RUN_DATE = s#QUERY_SEL_DATE_TMP
        WHERE CP.CP_ID = 5;
        EXECUTE IMMEDIATE 'DROP TABLE CHECK_POINT_TMP';
    END;
    Mais lorsque je tente de créer la 1ere Proc, j'ai ce message d'erreur de compil :
    ORA-0023: mot-clé FROM absent à l'emplacement prévu

    Euh...

  4. #4
    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
    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
    CREATE OR REPLACE PROCEDURE SCHEMA.P_DATE_CHECKPOINT
    IS
    s#QUERY_SEL_DATE   DATE;
    s#DATE_TMP         DATE;
    BEGIN
    s#DATE_TMP := TO_DATE ('01/01/1900', 'DD/MM/YYYY');
    SELECT CP.LAST_RUN_DATE
      INTO s#QUERY_SEL_DATE  /* DATE */
         FROM CHECK_POINT CP
        WHERE CP.CP_ID = 5;
    EXECUTE IMMEDIATE 'CREATE TABLE CHECK_POINT_TMP (LAST_RUN_DATE DATE)';
    INSERT INTO CHECK_POINT_TMP (LAST_RUN_DATE)
         VALUES (s#QUERY_SEL_DATE);
    UPDATE CHECK_POINT CP
       SET LAST_RUN_DATE = s#DATE_TMP
     WHERE CP.CP_ID = 5;
    END;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

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

  5. #5
    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
    Quel est l'objectif car la méthode n'est pas bonne.
    Il ne faut pas créer une table à la volée puis la drop, la table CHECK_POINT_TEMP doit être créer en dur.

    Ele peut être créée comme table temporaire si besoin, à savoir les données ne seront visibles que par la session mais attention à ce que les 2 méthodes soient bien lancée par la même session donc pas de déconnection.
    En tout cas seule les données sont temporaires pas la table elle même.

    Oracle n'est pas Sqlserver ou mysql.

  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
    Ok , OK !!!!
    Mais visiblement,pour l'instant, on en est aux premiers apprentissages du PL/SQL !
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

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

  7. #7
    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
    Citation Envoyé par skuatamad Voir le message
    Oracle n'est pas Sqlserver ou mysql.
    Votre conseil est juste et applicable à tous les SGBD !

  8. #8
    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
    Oui mais créer/supprimer des tables temporaires dans un traitement est une approche valide et classique sur sqlserver (ou dans une moindre mesure sur mysql) alors qu'elle ne l'est pas sur oracle.

    Mais peut être que dans les nouvelles versions de sqlserver elles sont moins utiles.

Discussions similaires

  1. [ADO] Problème avec LIKE dans requête paramétrée
    Par _skip dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 04/11/2007, 20h53
  2. Insérez variable PHP dans requête Mysql
    Par jeremie74 dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/08/2006, 18h21
  3. [SQL] Problème résultat checkbox dans requête SQL
    Par Skeud007 dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 02/07/2006, 15h02
  4. Problème avec date dans requête
    Par alain94 dans le forum Access
    Réponses: 2
    Dernier message: 22/05/2006, 07h49
  5. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34

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