Pb requete, reprise PL SQL
Bonjour,
J'ai un soucis avec ma requête PL SQL (ça fait plusieurs années que j'en avais pas fait et la reprise est difficile!)
J'ai 4 erreurs remontées visiblement dut à un pb de structure (Un Begin mal déclaré peut etre?)
Voici mon code :
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
|
create or replace procedure DWAUTO_PURGE_ALL_TABLES(NB_MOIS_RETENTION number)
is
maTable varchar2(30 char);
TABLE_NAME varchar2(100 char);
nbEnr integer;
currTable varchar2(30 char);
tbl_exist varchar2(30 char);
BEGIN
select TABLE_NAME into currTable from DBDWAUTOUSR.TMP_PURGE_ALL_TABLES;
EXCEPTION WHEN no_data_found THEN
currTable := ' ';
--END;
if currTable is null then
---init avec une chaine vide pour traiter toutes les tables
insert into DBDWAUTOUSR.TMP_PURGE_ALL_TABLES values (currTable);
end if;
for maTable in (select distinct substr(TABLE_NAME,1,16) as TABLE_NAME from all_tables where (REGEXP_like(TABLE_NAME,'^M[0-9]{6}_S[0-9]{7}$') or TABLE_NAME='MSG') AND OWNER = 'DBDWAUTOUSR' AND TABLE_NAME > currTable order by 1) loop
select count(*) into tbl_exist from all_tables where TABLE_NAME = 'TAB_TMP' and OWNER = 'DBDWAUTOUSR';
if tbl_exist = 1 then -- Si la table TMP existe alors...
select count(*) into cnt from maTable.TABLE_NAME;
if cnt != 0 then -- Si la table source n'est pas vide, on Drop la table TMP
execute immediate 'drop table DBDWAUTOUSR.TAB_TMP';
end if; -- Sinon on skip le Drop de la table TMP et on passe à la suite
end if;
dbms_output.put_line( 'create table DBDWAUTOUSR.TAB_TMP as select * from DBDWAUTOUSR.' || maTable.TABLE_NAME || ' WHERE date_rec >= add_months(sysdate, - ' || NB_MOIS_RETENTION || ')-1');
execute immediate 'create table DBDWAUTOUSR.TAB_TMP as select * from DBDWAUTOUSR.' || maTable.TABLE_NAME || ' WHERE date_rec >= add_months(sysdate, - ' || NB_MOIS_RETENTION || ')-1';
execute immediate 'truncate table DBDWAUTOUSR.' || maTable.TABLE_NAME ;
execute immediate 'insert /*+append */ into DBDWAUTOUSR. ' || maTable.TABLE_NAME || ' select * from DBDWAUTOUSR.TAB_TMP' ;
execute immediate 'drop table DBDWAUTOUSR.TAB_TMP purge' ;
update DBDWAUTOUSR.TMP_PURGE_ALL_TABLES set TABLE_NAME = maTable.TABLE_NAME;
end loop;
select count(*) into tbl_exist from all_tables where TABLE_NAME = 'TAB_TMP' and OWNER = 'DBDWAUTOUSR';
if tbl_exist = 1 then -- Si la table TMP existe alors...
delete from DBDWAUTOUSR.TMP_PURGE_ALL_TABLES;
end if;
END DWAUTO_PURGE_ALL_TABLES; |
Et voici mes erreurs :
Code:
1 2 3 4 5
|
Erreur(24,4): PL/SQL: SQL Statement ignored
Erreur(24,42): PL/SQL: ORA-00942: Table ou vue inexistante
Erreur(25,4): PL/SQL: Statement ignored
Erreur(25,7): PLS-00201: identifier 'CNT' must be declared |
J'ai d'abord pensé à une ligne non fermé par un ";" mais visiblement c'est pas ça...
Si quelqu'un à des pistes ou voit une erreur je suis preneur !
Merci d'avance pour votre aide.