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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| SET SERVEROUTPUT ON SIZE 100000;
Declare
/* Variables gestion de table GFITEST1 */
vnumero number(12); /* Numero de la requete (GFITEST1.numero) */
Vreq varchar2(4000); /* Requete (GFITEST1.requete) */
/* Variables de traitement des erreurs */
VSQLCODE number; /* Code retour erreur oracle */
vSQLERRM varchar2(4000); /* Message retour erreur oracle */
ErrMajGfiTest varchar2(1); /* Code retour a l'appel de la procedure majgfitest ('O' ou 'N') */
/* Variables traitement de calcul */
vMsgErr varchar2(200);
vd1 timestamp; /* Date de debut de traitement */
vd2 timestamp; /* Date de fin de traitement */
vd3 varchar2(6); /* Temps d'execution du traitement au format 99,999 sec */
/* Variable flag -> true si l'execute immediate se passe bien false sinan */
vbexecuteimmediat boolean;
/* Sélection des requetes SQL*/
cursor C1 is SELECT G.NUMERO,G.REQUETE
FROM GFITEST G ORDER BY G.NUMERO;
BEGIN
/* Début de la boucle du cursor 1 */
OPEN C1;
LOOP
vbexecuteimmediat := true;
vnumero := 0;
Vreq := null;
ErrMajGfiTest := 'N';
fetch C1 into Vnumero,Vreq;
exit when C1%NOTFOUND;
/********************************************************************************/
/*Affichage du numero de la requete */
/********************************************************************************/
DBMS_OUTPUT.PUT_LINE('Requete numero:' ||Vnumero);
/********************************************************************************/
/* Suppression des caracteres indesirables */
/********************************************************************************/
select translate(vreq,'{',' ') into vreq from dual;
select translate(vreq,'}',' ') into vreq from dual;
select translate(vreq,chr(10),' ') into vreq from dual;
select translate(vreq,chr(13),' ') into vreq from dual;
/********************************************************************************/
/* Recuperation heure de debut */
/********************************************************************************/
vd1 := systimestamp;
/********************************************************************************/
/*Execution de la requete */
/********************************************************************************/
BEGIN
execute immediate Vreq;
EXCEPTION
WHEN OTHERS then
vbexecuteimmediat := false;
vSQLCODE := SQLCODE;
if vSQLCODE=-20002 or vSQLCODE=20002 then
vSQLERRM := 'Erreur trigger';
else
if vSQLCODE=-1001 or vSQLCODE=1001 then
vSQLERRM := 'Erreur procédure';
else
vSQLERRM := SQLERRM;
end if;
end if;
vmsgerr := 'SQLCODE = ' || vSQLCODE || ' ' || 'SQLERRM:' || vSQLERRM;
/*update gfitest set comm=vmsgerr where numero=Vnumero;*/
majgfitest(null,vmsgerr,null,null,vnumero,ErrMajGfiTest);
if ErrMajGfiTest = 'O' then
DBMS_OUTPUT.PUT_LINE('!!! Probleme insertion dans GFITEST !!!');
end if;
END;
/********************************************************************************/
/* Recuperation heure de fin */
/********************************************************************************/
vd2 := systimestamp;
/********************************************************************************/
/* Calcul du temps de la requete */
/********************************************************************************/
vd3 := substr(to_char(vd2-vd1),18,6);
vmsgerr := 'SQLCODE = ' || SQLCODE || ' ' || 'SQLERRM:' || SQLERRM;
/********************************************************************************/
/* Ecriture du temps et du msg d'erreur dans la table */
/********************************************************************************/
if vbexecuteimmediat = true then
/*update gfitest set temps= vd3,comm=vmsgerr,datedeb=vd1,datefin=vd2 where numero=Vnumero;*/
majgfitest(vd3,vmsgerr,vd1,vd2,vnumero,ErrMajGfiTest);
if ErrMajGfiTest = 'O' then
DBMS_OUTPUT.PUT_LINE('!!! Probleme insertion dans GFITEST !!!');
end if;
end if;
rollback; /* marche mais il faudrait un rollback "general" style if fin de loop then rollback */
END LOOP;
rollback; /* ne marche pas car cela commit qd mm */
CLOSE C1;
exception
when others then
rollback;
vmsgerr := 'SQLCODE = ' || SQLCODE || ' ' || 'SQLERRM:' || SQLERRM;
DBMS_OUTPUT.PUT_LINE(vmsgerr);
DBMS_OUTPUT.PUT_LINE('Arret du programme - Erreur fatale!');
end;
/ |
Partager