Reputation: 267
I have created SP for creating unique index
on multiple tables.
Now i need to create Try-catch (exception handling) for this, like incase index not created this should be catch ....
For example i have 200 tables and only 1 tables is giving error, Then 199 tables should be created with index and catch log have that one error-ed tables name.
Please help .
DECLARE
CURSOR C_TABLE IS
SELECT INPUT_TABLE,HISTORY_TABLE FROM FUNCTIONS WHERE TARGET_SYS IN ('ABC','DEC') AND ACTIVE_FLAG='Y';
SQL_CREATE_INX VARCHAR2(200);
SQL_TABLE_NAME VARCHAR2(200);
BEGIN
-- INPUT TABLE
FOR I IN C_TABLE
LOOP
SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||I.INPUT_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE) ';
SQL_TABLE_NAME:=I.INPUT_TABLE;
EXECUTE IMMEDIATE SQL_CREATE_INX;
DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL INPUT TABLES');
-- OUTPUT TABLE
FOR H IN C_TABLE
LOOP
SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||H.HISTORY_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE) ';
SQL_TABLE_NAME:=H.HISTORY_TABLE;
EXECUTE IMMEDIATE SQL_CREATE_INX;
DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
END LOOP;
DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL OUTPUT TABLES');
END;
Upvotes: 1
Views: 19434
Reputation: 2813
In oracle handling of exceptions is like below
Declare
--declaration
BEGIN
--executable_section
EXCEPTION
WHEN exception_name1 THEN
[statements]
WHEN exception_name2 THEN
[statements]
WHEN exception_name_n THEN
[statements]
WHEN OTHERS THEN
[statements]
END
By editing your procedure with exception block is below
DECLARE
CURSOR C_TABLE IS
SELECT INPUT_TABLE,HISTORY_TABLE FROM FUNCTIONS WHERE TARGET_SYS IN ('ABC','DEC') AND ACTIVE_FLAG='Y';
var1 number;
var2 number;
SQL_CREATE_INX VARCHAR2(200);
SQL_TABLE_NAME VARCHAR2(200);
BEGIN
-- INPUT TABLE
FOR I IN C_TABLE
LOOP
select 1 into var1 from user_tables where table_name=upper(i.INPUT_TABLE)
if var1=1
then
SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||I.INPUT_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE) ';
SQL_TABLE_NAME:=I.INPUT_TABLE;
EXECUTE IMMEDIATE SQL_CREATE_INX;
DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
end if;
END LOOP;
DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL INPUT TABLES');
-- OUTPUT TABLE
FOR H IN C_TABLE
LOOP
select 1 into var2 from user_tables where table_name=upper(h.HISTORY_TABLE)
if var2=1
then
SQL_CREATE_INX:='CREATE UNIQUE INDEX CLM1.AUDIT_SUB_SITE_INX ON '||H.HISTORY_TABLE||' (AUDIT_NBR , SUB_AUDIT_NBR , STATE) ';
SQL_TABLE_NAME:=H.HISTORY_TABLE;
EXECUTE IMMEDIATE SQL_CREATE_INX;
DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
end if;
END LOOP;
DBMS_OUTPUT.PUT_LINE('INDEXES CREATED FOR ALL OUTPUT TABLES');
exception
WHEN OTHERS THEN
Dbms_output.put_line(sqlerrm ||' error occured with this error code '||SQLCODE);
END;
Some Predefined exceptions in oracle and edit the plsql block with your exception name.
Upvotes: 1
Reputation: 17920
You need to enclose all EXEC IMMEDIATE
into BEGIN .. END
FOR (.... )
LOOP
/*
* Other Statements
*/
BEGIN /* try */
EXECUTE IMMEDIATE SQL_CREATE_INX;
/* If it is success the below output happens */
DBMS_OUTPUT.PUT_LINE('INDEX DONE : '||SQL_TABLE_NAME);
EXCEPTION /*catch */
/* It is like catch(Exception e) All execeptions go here..*/
WHEN OTHERS THEN
/* Log your error message here.. SQLERRM has it..*/
DBMS_OUTPUT.PUT_LINE('DDL FAILED FOR '||SQL_TABLE_NAME||'::FAILED WITH ERROR::'||SQLERRM);
END;
/*
* Other Statements
*/
END LOOP;
Upvotes: 3