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 20/05/2011, 10h02   #1
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
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 :
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 :
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 :
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
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 13h27   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
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 :
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 :
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/05/2011, 14h04   #3
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
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 ?
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 17h11   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Trunc(sysdate - 7) est déjà une date
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web