You are on page 1of 4

DECLARE

SQLstr VARCHAR2 (2300);


alterSQLstr VARCHAR2 (2300);
X VARCHAR2(10000):=NULL ;
X_O VARCHAR2(10000):=NULL ;
X_U VARCHAR2(10000):=NULL ;
X_D VARCHAR2(10000):=NULL ;
NEW_TABLE_NAME VARCHAR2(1000);
xx varchar2(10000);
DROPSQL varchar2(10000);
cnt number;
have_is_active number :=0;
HAVE_IS_ACTIVE_DESC VARCHAR2(1000);
BEGIN
FOR I IN (SELECT TABLE_NAME ,length(TABLE_NAME) TABLE_LENGTH
FROM all_TABLES
WHERE owner='CMS'
-- and TABLE_NAME like 'AUTHORIZATION_AUDIT'
and length(TABLE_NAME) <=28
--AND TABLE_NAME LIKE'CUSTOMER_STATUS'
) LOOP

select count(*)
into cnt
from all_TABLES
WHERE owner='CMS'
and I.TABLE_NAME||'_A' LIKE TABLE_NAME ;

IF cnt = 0 then
IF I.TABLE_LENGTH <=28 THEN

NEW_TABLE_NAME:=i.TABLE_NAME ||'_A' ;
SQLstr := 'CREATE TABLE ' ||NEW_TABLE_NAME||'
AS SELECT * FROM '||i.TABLE_NAME|| ' WHERE 1=0';
DROPSQL:='DROP TABLE ' ||NEW_TABLE_NAME ;
--DBMS_OUTPUT.PUT_LINE (SQLSTR);
BEGIN
--EXECUTE IMMEDIATE DROPSQL;
EXECUTE IMMEDIATE SQLstr;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR WHEN CREATE NEW
TABLE =='||SQLstr) ;
END;

alterSQLstr:='alter table ' ||NEW_TABLE_NAME||


' add (
operation_name
varchar2(2) ,
operation_date date
)'
;
BEGIN
EXECUTE IMMEDIATE alterSQLstr;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR WHEN ALTER NEW
TABLE =='||alterSQLstr) ;
END;
--create trigger
FOR J IN ( SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE owner = 'CMS'
and TABLE_NAME like
UPPER(NEW_TABLE_NAME)
and COLUMN_NAME not in
('OPERATION_NAME','OPERATION_DATE')
order by COLUMN_ID ) LOOP

X:=X||' :NEW.'||J.COLUMN_NAME ||' , ' ||


chr(10);
X_O:=X_O||' :OLD.'||J.COLUMN_NAME ||' ,
' || chr(10);

--------------New By Moataz 25/8/2015


IF J.COLUMN_NAME LIKE 'IS_ACTIVE' THEN
have_is_active:=1 ;
END IF;

END LOOP ;
--x:=substr(x, 0, length(x)-3) ;
x:=x||' '||''''|| 'I'||''''||' , sysdate ' ;
x_U:=x_O||' '||''''|| 'U'||''''||' , sysdate '
;
x_D:=x_O||' '||''''|| 'D'||''''||' , sysdate '
;

--------------MOATAZ NEW
IF have_is_active =0 THEN
HAVE_IS_ACTIVE_DESC:=

'INSERT INTO '||NEW_TABLE_NAME||


' VALUES ( ' ||chr(10)||
x_U||' ) ; ' ;
ELSE
HAVE_IS_ACTIVE_DESC:= 'IF
:NEW.IS_ACTIVE = 0 THEN '|| chr(10)||

' '||

'INSERT INTO '||NEW_TABLE_NAME||chr(10)||

' VALUES ( ' ||chr(10)|| x_D||' ) ; '

|| chr(10)||

'ELSE' || chr(10)||

' '||

'INSERT INTO '||NEW_TABLE_NAME||chr(10)||

' VALUES ( ' ||chr(10)|| x_U||' ) ; '

|| chr(10)||
'END IF ;'

;
END IF;

xx:=
'CREATE OR REPLACE TRIGGER '||i.TABLE_NAME
||'_T'
||chr(10)||' BEFORE INSERT OR UPDATE OR DELETE
ON ' ||i.TABLE_NAME || ' REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW '
||chr(10)||'DECLARE
BEGIN
IF INSERTING THEN '
||chr(10)||
'INSERT INTO '||NEW_TABLE_NAME||
' VALUES ( ' ||chr(10)||
x||' ) ; '
|| chr(10) ||

--UPDATING
' ELSIF UPDATING THEN '
|| chr(10) ||HAVE_IS_ACTIVE_DESC
--- 'INSERT INTO '||NEW_TABLE_NAME||
--- ' VALUES ( ' ||chr(10)||
HAVE_IS_ACTIVE_DESC||' ) ; '
|| chr(10) ||

--UPDATING
' ELSIF DELETING THEN '
|| chr(10) ||
'INSERT INTO '||NEW_TABLE_NAME||
' VALUES ( ' ||chr(10)||x_D||'
) ; '
|| chr(10) ||' end if ; ' ||

chr(10) || ' end ;';

DBMS_OUTPUT.PUT_LINE( xx) ;

-----------------------------------------------------------------------------------
----------------
BEGIN
EXECUTE IMMEDIATE xx;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR WHEN CREATE
ATRIGER FOR TABLE =='||xx) ;
END;

NEW_TABLE_NAME:='';
SQLstr :='';
alterSQLstr :='';
X :='';
X_O :='';
X_U :='';
X_D :='';
NEW_TABLE_NAME :='';
xx :='';
DROPSQL :='';
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE('LOG TABLE EXIST FOR TABLE '||
I.TABLE_NAME) ;
END IF;

END LOOP ;

END;

You might also like