We need to deploy changes in the database either for a full version release or a bug fix.
I had seen in many projects we didn't provide much attention to this step & thinking database a just container for the data. But if pay attention to this from the start of development and test our scripts in a testing environment we can avoid lot of implementation issues in the production.
When you are planning to implement changes think following points and judge where your implementation Strategy stands.
1. What efforts require to run the database changes
Ideal Scenario It should run from a mouse click in window’s environment or just calling a single file In UNIX or Linux operating system.
2. Are your scripts providing logs for errors and messages for success or failure?
Scripts must provide the logs for each and every activity..
3 Is your scripts are robust.
How many time you run your scripts they should not fail.
4.If you face errors, during the implementation how easily you can track them and fix them.
Scripts with logs can make this process easy to track any issues.
To explain the process here we are creating the following objects in SCOTT schema.
TABLEX
one Primary key CONSTRAINTX
one sequence SEQ_X
Create all this objects in separate files so that we can debug them easily, in case of any error.
Let’s see how to create a robust script for table creation.
Check first table exist in the database from user_tables data dictionary view if no then create the table else give the message
.-------------------------------------------------------------------------------------
Prompt Creating table ...
-- Create table
DECLARE
fCOUNT INTEGER;
fString Varchar2(1000):=NULL;
BEGIN
SELECTCOUNT(*) INTO FCOUNT FROM USER_TABLES
WHERETABLE_NAME='TABLEX';
IF FCOUNT = 0 THEN
fString:='create table TABLEX (
col1 VARCHAR2(5) not null,
col2 NUMBER(10) not null )';
EXECUTEIMMEDIATE fString;
DBMS_OUTPUT.PUT_LINE('TABLEX CREATED SUCCESSFULLY');
ELSE
DBMS_OUTPUT.PUT_LINE('TABLEX ALREADY EXISTS');
ENDIF;
END;
/
-------------------------------------------------------------------------------------
-- Create table
DECLARE
fCOUNT INTEGER;
fString Varchar2(1000):=NULL;
BEGIN
SELECTCOUNT(*) INTO FCOUNT FROM USER_TABLES
WHERETABLE_NAME='TABLEX';
IF FCOUNT = 0 THEN
fString:='create table TABLEX (
col1 VARCHAR2(5) not null,
col2 NUMBER(10) not null )';
EXECUTEIMMEDIATE fString;
DBMS_OUTPUT.PUT_LINE('TABLEX CREATED SUCCESSFULLY');
ELSE
DBMS_OUTPUT.PUT_LINE('TABLEX ALREADY EXISTS');
ENDIF;
END;
/
-------------------------------------------------------------------------------------
Save this text as table.sql
-------------------------------------------------------------------------------------
Example how to create a Sequence .
Check first sequence exist in the database from user_sequences data dictionary view if no then create the sequence else give the message.
-------------------------------------------------------------------------------------
declare
fcount number;
fstring varchar2(1000);
begin
selectcount(*) into fcount fromuser_sequences where sequence_name='SEQ_X';
if fcount =0then
fstring:='CREATE SEQUENCE SEQ_X
MINVALUE 1 MAXVALUE 99999
INCREMENT BY 1 START WITH 1
NOCACHE NOORDER
NOCYCLE';
executeimmediatefstring;
dbms_output.put_line ('Sequence SEQ_X created successfully');
else
dbms_output.put_line ('Sequence SEQ_X allready exists');
endif;
end ;
/
-------------------------------------------------------------------------------------
fcount number;
fstring varchar2(1000);
begin
selectcount(*) into fcount fromuser_sequences where sequence_name='SEQ_X';
if fcount =0then
fstring:='CREATE SEQUENCE SEQ_X
MINVALUE 1 MAXVALUE 99999
INCREMENT BY 1 START WITH 1
NOCACHE NOORDER
NOCYCLE';
executeimmediatefstring;
dbms_output.put_line ('Sequence SEQ_X created successfully');
else
dbms_output.put_line ('Sequence SEQ_X allready exists');
endif;
end ;
/
-------------------------------------------------------------------------------------
Save this text as seq.sql
-------------------------------------------------------------------------------------
Example script to create a Primary Key
Check first constraint exist on the table from user_constraints data dictionary view if no then create the Constraint else give the message.
-------------------------------------------------------------------------------------
DECLARE
fCount Integer;
fString varchar2(250):=NULL;
BEGIN
selectCOUNT(*) INTO FCOUNT fromuser_constraints
where table_name='TABLEX'and constraint_type='P'
and constraint_name='CONSTRAINTX';
IF FCOUNT = 0 THEN
fString:= 'alter table TABLEX add constraint CONSTRAINTX primary key (col1)';
EXECUTEIMMEDIATEfString;
DBMS_OUTPUT.PUT_LINE('PRIMARY Key CONSTRAINT CONSTRAINTX ON TABLE TABLEX CREATED SUCCESSFULLY');
ELSE
DBMS_OUTPUT.PUT_LINE('PRIMARY Key CONSTRAINT CONSTRAINTX ON TABLE TABLEX allready EXISTS');
ENDIF;
End;
/
-------------------------------------------------------------------------------------
fCount Integer;
fString varchar2(250):=NULL;
BEGIN
selectCOUNT(*) INTO FCOUNT fromuser_constraints
where table_name='TABLEX'and constraint_type='P'
and constraint_name='CONSTRAINTX';
IF FCOUNT = 0 THEN
fString:= 'alter table TABLEX add constraint CONSTRAINTX primary key (col1)';
EXECUTEIMMEDIATEfString;
DBMS_OUTPUT.PUT_LINE('PRIMARY Key CONSTRAINT CONSTRAINTX ON TABLE TABLEX CREATED SUCCESSFULLY');
ELSE
DBMS_OUTPUT.PUT_LINE('PRIMARY Key CONSTRAINT CONSTRAINTX ON TABLE TABLEX allready EXISTS');
ENDIF;
End;
/
-------------------------------------------------------------------------------------
Save this text as PK.sql
-------------------------------------------------------------------------------------
Now to create the one file which call all this files .Set session settings accordingly using SQL*PLUS commands. spool is create the logs.
-------------------------------------------------------------------------------------
Set echo off
set autoprint off
set heading off
set feedback off
Set Define off
set serveroutput on SIZE 10000
SPOOL RUN_ME.LOG
@table.sql
@pk.sql
@seq.sql
PROMPT Task completed successfully
Set echo oN
set autoprint oN
set heading oN
set feedback oN
Set Define oN
set serveroutput oFF
SPOOL OFF
Exit
-------------------------------------------------------------------------------------
Save this text as RUN_ME.SQL
-------------------------------------------------------------------------------------
How to create the batch file to run this RUN_ME.sql from window’s environment with one click
We are prompting the user are you sure you want to execute the scripts if yes then check for run_me.log file exist if yes delete it then open sqlplus in silent mode and connect to user and
Run the run_me.sql file. And for checking the logs open run_me.log file.
-------------------------------------------------------------------------------------
@echo off
cls
set /p choice=ARE YOU SURE TO EXECUTE SCRIPTS in %DbName% (y/n) ?
if '%choice%'=='y' goto begin
goto end
:begin
if exist Run_ME.log then del RUN_ME.log
@echo on
sqlplus -S scott/tiger@test @run_me.sql
@notepad run_me.log
:end
Exit
-------------------------------------------------------------------------------------
Save this file as execute_me.batAnd make sure file extension is a batch file.
-------------------------------------------------------------------------------------
And after clicking on execute_me.bat check the logs from RUN_ME.log file
Sample of logs
Creating table ...
TABLEX ALREADY EXISTS
PRIMARY Key CONSTRAINT CONSTRAINTX ON TABLE TABLEX allready EXISTS
SEQUENCE SEQ_X ALLREADY EXIST
Your Comments & Suggestions are always welcome