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 :

ORA 00936 Execute Immediate into


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 ORA 00936 Execute Immediate into
    Bonjour,

    j'ai fait un script PL/SQL et ce dernier plante à cause de mon EXECUTE IMMEDIATE INTO.

    J'ai regarder les post précédent et sa ne fonctionne toujours pas.

    Voici le script :

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    .
    create or replace
    PROCEDURE BDEHISTO AS
     
    v_Periodicite   number;
    v_table		  	varchar2(50);
    v_requete		varchar2(2000);
    v_verif_purge   varchar2(100);
    v_cpt number ;
     
    cursor C1 is
    	   select Latable,periodicite,ladate, ladate2
    	   from histo;
     
    C1r	   C1%ROWTYPE;
     
    BEGIN
    DBMS_OUTPUT.PUT_LINE ('DEBUT');
    OPEN C1;
        FETCH C1 INTO C1r;
        -- on parcours la table Histo
        while C1%FOUND loop
          v_requete:='SELECT COUNT(*) FROM '||C1r.Latable||'@bdepkg';
          EXECUTE IMMEDIATE v_requete into v_cpt ;
          DBMS_OUTPUT.PUT_LINE( To_char( v_cpt ) || ' enregistrements') ;
          DBMS_OUTPUT.PUT_LINE(C1r.Latable);
     
        -- si =0 alors il vient d'avoir une purge donc on ne met rien a jour
    		if v_cpt>0 then
    			if C1r.latable='VLBL' then
    				v_requete := 'delete from vlbl where chronobl in ( select chronobl from vbl where to_date(dpre,''DD/MM/YY'') > TO_DATE(TO_CHAR(SYSDATE-7,''DD/MM/YY''),''DD/MM/YY''))';
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
            v_requete := 'insert into vlbl select * from vlbl@bdepkg where chronobl in ( select chronobl from vbl where to_date(dpre,''DD/MM/YY'') > TO_DATE(TO_CHAR(SYSDATE-7,''DD/MM/YY''),''DD/MM/YY''))';
              EXECUTE IMMEDIATE v_requete;
              commit;
     
    			end if;
    			if C1r.ladate is null then
     
    				-- on supprime les anciennes saisies
    				v_requete := 'delete from '|| C1r.Latable ||' where to_date('|| C1r.ladate ||',''YYYY/MM/DD'') > TO_DATE(TO_CHAR(SYSDATE-7,''YYYY/MM/DD''),''YYYY/MM/DD'')';
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
    				-- on met à jour BDE Histo
    				v_requete := 'insert into '|| C1r.Latable ||' select * from '|| C1r.Latable ||'@bdepkg where to_date('|| C1r.ladate ||',''YYYY/MM/DD'') > TO_DATE(TO_CHAR(SYSDATE-7,''YYYY/MM/DD''),''YYYY/MM/DD'')'; 
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
    			elsif c1r.ladate2 is null then
     
    				-- on supprime les anciennes saisies
    				v_requete := 'delete from '|| C1r.Latable ||' where to_date('|| C1r.ladate2 ||',''DD/MM/YY'') < TO_DATE(TO_CHAR(SYSDATE-7,''DD/MM/YY''),''DD/MM/YY'')';
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
    				-- on met à jour BDE Histo
    				v_requete := 'insert into '|| C1r.Latable ||' select * from '|| C1r.Latable ||'@bdepkg where to_date('|| C1r.ladate2 ||',''DD/MM/YY'') < TO_DATE(TO_CHAR(SYSDATE-7,''DD/MM/YY''),''DD/MM/YY'')';
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
          elsif c1r.ladate is null and c1r.ladate2 is null then
     
            -- on supprime les anciennes saisies
    				v_requete := 'TRUNCATE TABLE '||c1r.latable;
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
    				-- on met à jour BDE Histo
    				v_requete := 'insert into '|| C1r.Latable ||' select * from '|| C1r.Latable ||'@bdepkg';
    				EXECUTE IMMEDIATE v_requete;
    				commit;
     
    			end if;
    		end if;
        FETCH C1 into C1r;
        end loop;
        DBMS_OUTPUT.PUT_LINE ('FINI');
    CLOSE C1;
    END;

    L'erreur se situe sur cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    v_requete:='SELECT COUNT(*) FROM '||C1r.Latable||'@bdepkg';
          EXECUTE IMMEDIATE v_requete into v_cpt ;
          DBMS_OUTPUT.PUT_LINE( To_char( v_cpt ) || ' enregistrements') ;
          DBMS_OUTPUT.PUT_LINE(C1r.Latable);
    et voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Connexion à la base de données BDEPROC.
    ORA-00936: expression absente
    ORA-06512: à "BDE.BDEHISTO", ligne 54
    ORA-06512: à ligne 2
    DEBUT
    1598879 enregistrements
    CCART
    Processus fermé.
    Déconnexion de la base de données BDEPROC.
    Dès que j'enleve le into, la procédure fonctionne mais il n'y a plus de valeur dans v_cpt, par contre avec le into v_cpt prend bien une valeur mais le script plante ... ai-je bien identifier le problème ? ou l'erreur est ailleurs ?

    Merci d'avance
    Pourquoi faire simple quand on peut faire .......... compliqué

  2. #2
    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 base avec EXECUTE IMMEDIATE : Toute chaine exécutée doit être tracée afin de vérifier la justesse de la requête (du moins lors du développement)

    Le plus simple est de faire une procédure autonome qui insère la requête dans une table.

    Le problème te sautera aux yeux sur les delete ou insert

    Second point :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF C1r.ladate IS NULL THEN
          	v_requete := 'delete from '|| C1r.Latable ||' where to_date('|| C1r.ladate ||',''YYYY/MM/DD'') '...
    Si C1r.ladate est NULL alors tu teste une date nulle => le test ne sera jamais bon.


    Troisième point :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_DATE(TO_CHAR(SYSDATE-7,''DD/MM/YY''),''DD/MM/YY'')
    transformer une date -> en chaine -> en date, pas terrible.
    Un simple suffit.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  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
    Oo dure ! j'ai inversé les conditions sa a l'air de fonctionner ! persuader que sa venait du into j'ai pas regarder ailleurs ...

    En ce qui concerne le truncate je fait un :

    to_date(trunc(sysdate-7)) c'est sa ?
    Pourquoi faire simple quand on peut faire .......... compliqué

  4. #4
    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
    Trunc(sysdate - 7) est déjà une date
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. execute immediate into -une variable- ?
    Par betty33 dans le forum SQL
    Réponses: 8
    Dernier message: 19/03/2008, 13h34
  2. Réponses: 4
    Dernier message: 11/10/2007, 08h51
  3. Réponses: 5
    Dernier message: 07/08/2007, 12h20
  4. Equivalents de EXECUTE IMMEDIATE ... RETURNING INTO ... ?
    Par swirtel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2005, 10h21
  5. Execute immediate et nom reserves
    Par nuke_y dans le forum Oracle
    Réponses: 3
    Dernier message: 22/11/2004, 18h17

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