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 :
Et voici mes erreurs :
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 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;
J'ai d'abord pensé à une ligne non fermé par un ";" mais visiblement c'est pas ça...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Si quelqu'un à des pistes ou voit une erreur je suis preneur !
Merci d'avance pour votre aide.
Partager