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 27/01/2012, 14h46   #1
Invité de passage
 
Homme thibault Berthier
Développeur Web
Inscription : juillet 2011
Messages : 24
Détails du profil
Informations personnelles :
Nom : Homme thibault Berthier
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : juillet 2011
Messages : 24
Points : 1
Points : 1
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 :
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 :
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...
Tybaal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h08   #2
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Pas de sql dynamique pour du DML !!!
Code :
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 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h29   #3
Invité de passage
 
Homme thibault Berthier
Développeur Web
Inscription : juillet 2011
Messages : 24
Détails du profil
Informations personnelles :
Nom : Homme thibault Berthier
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : juillet 2011
Messages : 24
Points : 1
Points : 1
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 :
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 :
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...
Tybaal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h38   #4
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Code :
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 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h51   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 27/01/2012, 15h55   #6
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
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 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 16h55   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
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 688
Points : 10 444
Points : 10 444
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par skuatamad Voir le message
Oracle n'est pas Sqlserver ou mysql.
Votre conseil est juste et applicable à tous les SGBD !
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 18h31   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h58.


 
 
 
 
Partenaires

Hébergement Web