CREATE OR REPLACE PROCEDURE CREATE_AUDIT_TABLE (v_table_name IN VARCHAR2, — Table Name that already exists.
v_init_extent IN NUMBER := 10240, — Initial Extent – also used for Next Extent in K
v_init_storage IN NUMBER := 10240) — Initial Table Storage in K – also used for Next Storage
IS
/*
DESCRIPTION:
This procedure creates a standard audit table based on a currently existing oracle table.

REVISIONS:
Ver Date Author Description
——— ———- ————— ————————————
1.0 19/06/2002 DRC 1. Created this procedure.

PARAMETERS:
NOTES:
Make sure owner has CREATE ANY TABLE & CREATE ANY SEQUENCE privilege.
*/

sql_string VARCHAR2(4000);
v_column_name VARCHAR2(30);
v_data_type VARCHAR2(30);
v_data_length VARCHAR2(5);
v_nullable VARCHAR2(1);
v_nullable2 VARCHAR2(30);

CURSOR get_table_info IS
select column_name, data_type, data_length, nullable
from user_tab_columns
where table_name = v_table_name
order by column_id;

v_table_info get_table_info%ROWTYPE;

BEGIN
sql_string := ‘CREATE TABLE ‘ || v_table_name ||
‘_AUDITS ( TRANSACTION_ID NUMBER NOT NULL,’;

— First of all get the NEW_ columns.
OPEN get_table_info;
<>
LOOP
v_column_name := NULL;
v_data_type := NULL;
v_data_length := NULL;
v_nullable := NULL;

FETCH get_table_info INTO v_column_name, v_data_type, v_data_length, v_nullable;

IF get_table_info%NOTFOUND THEN
EXIT code_loop;
END IF;

SELECT decode(v_nullable,’N’,’NOT NULL’,’Y’,’ ‘,v_nullable) into v_nullable2 from dual;

IF v_data_length IS NULL OR v_data_type IN (‘DATE’,’NUMBER’) THEN
sql_string := sql_string || v_column_name || ‘ ‘ || v_data_type || ‘ ‘ || v_nullable2 || ‘,’ || chr(10);
ELSE
sql_string := sql_string || v_column_name || ‘ ‘ || v_data_type || ‘ (‘ || v_data_length || ‘) ‘ || v_nullable2 || ‘,’ || chr(10);
END IF;

END LOOP;
CLOSE get_table_info;

–Now for the OLD_ columns
OPEN get_table_info;
<>
LOOP

v_column_name := NULL;
v_data_type := NULL;
v_data_length := NULL;
v_nullable := NULL;

FETCH get_table_info INTO v_column_name, v_data_type, v_data_length, v_nullable;

IF get_table_info%NOTFOUND THEN
EXIT code_loop2;
END IF;

SELECT decode(v_nullable,’N’,’NOT NULL’,’Y’,’ ‘,v_nullable) into v_nullable2 from dual;

IF v_data_length IS NULL OR v_data_type IN (‘DATE’,’NUMBER’) THEN
sql_string := sql_string || ‘ OLD_’ || v_column_name || ‘ ‘ || v_data_type || ‘ ‘ || v_nullable2 || ‘,’ || chr(10);
ELSE
sql_string := sql_string || ‘ OLD_’ || v_column_name || ‘ ‘ || v_data_type || ‘ (‘ || v_data_length || ‘) ‘ || v_nullable2 || ‘,’ || chr(10) ;
END IF;

END LOOP;
CLOSE get_table_info;

sql_string := sql_string || ‘TRANSACTION_TYPE VARCHAR2(10) NOT NULL, ‘ || chr(10) ||
‘TRANSACTION_DATE DATE NOT NULL, UPDATED_BY VARCHAR2(30) NOT NULL,’ || chr(10);

sql_string := sql_string || ‘ CONSTRAINT ‘ || v_table_name || ‘_AUD_PK PRIMARY KEY ( TRANSACTION_ID )’ || chr(10) ||
‘ USING INDEX TABLESPACE INDEXES PCTFREE 10’ || chr(10) ||
‘ STORAGE ( INITIAL ‘ || v_init_storage || ‘K NEXT ‘ || v_init_storage || ‘K PCTINCREASE 0 ))’ || chr(10) ||
‘ TABLESPACE DATA’ || chr(10) ||
‘ PCTFREE 10’ || chr(10) ||
‘ PCTUSED 40’ || chr(10) ||
‘ INITRANS 1’ || chr(10) ||
‘ MAXTRANS 255’ || chr(10) ||
‘ STORAGE ( ‘ || chr(10) ||
‘ INITIAL ‘ || v_init_extent || chr(10) ||
‘ NEXT ‘ || v_init_extent || chr(10) ||
‘ MINEXTENTS 1’ || chr(10) ||
‘ MAXEXTENTS 2147483645’ || chr(10) ||
‘ FREELISTS 1 FREELIST GROUPS 1 )’ || chr(10) ||
‘ NOCACHE’;

execute immediate sql_string;

dbms_output.put_line(‘Audit Table ‘ || v_table_name || ‘_AUDITS ‘ || ‘Created.’);

sql_string := NULL;
sql_string := ‘COMMENT ON TABLE ‘ || v_table_name || ‘_AUDITS IS ”This is an audit table for the ‘ || v_table_name || ‘ table”’;
execute immediate sql_string;

EXCEPTION
WHEN others THEN
dbms_output.put_line(sqlerrm);

END;
/

How to create an Oracle dynamic audit table

Leave a Reply

Your email address will not be published. Required fields are marked *

one + seven =