Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> Debugging scripts
Good Morning!
I have a script that an Oracle DBA type person created.
Sometimes, when running it, it does not finish but instead errors out.
I want to have some debug statements (a la Sql's Print '')sent to the spool file so I can figure out where the problem is.
Here is a shortened version of the script (the real one loops for 97 iterations):
TableName Varchar2(25), KeyField Varchar2(25), Sequence Char(1));
V_TableRecord t_TableRecord;
TYPE t_SeqTables IS TABLE OF V_TableRecord%Type INDEX BY BINARY_INTEGER; V_Tables t_SeqTables;
V_COUNTER NUMBER; V_CursorID NUMBER; V_DropString VARCHAR2(100); V_CreateString VARCHAR2(500); V_Permissions VARCHAR2(500); V_Dummy NUMBER; V_SelectStatement VARCHAR2(500); V_StartValue BINARY_INTEGER; V_SEQUENCE_NAME VARCHAR2(25); V_Synonym_Name VARCHAR2(30); V_FoundSequence VARCHAR2(3); V_FoundSynonym VARCHAR2(3);
BEGIN
V_Tables(1).TableName := 'ARC_TBLNOTES'; V_Tables(1).KeyField := 'CNTNOTESID'; V_Tables(1).Sequence := 'N';
<snip>
v_Tables(97).TableName := 'tblDLPrevNotes'; V_Tables(97).KeyField := ''; V_Tables(97).Sequence := 'N';
FOR v_LoopCounter IN 1..97 LOOP
/***************************** GET LAST COUNTER USED
*******************************
IF V_Tables(V_LoopCounter).Sequence='Y'
THEN
V_CursorID := DBMS_SQL.OPEN_CURSOR;
V_SelectStatement:= 'SELECT MAX(^)
FROM TIMADMIN.!';
DBMS_SQL.PARSE(V_CursorID, V_SelectStatement, DBMS_SQL.V7);
DBMS_SQL.DEFINE_COLUMN(V_CursorID, 1, V_COUNTER);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
LOOP
IF DBMS_SQL.FETCH_ROWS(V_CursorID)=0 THEN
EXIT;
END IF;
END LOOP;
DBMS_SQL.COLUMN_VALUE(V_CursorID, 1, V_COUNTER);
IF V_COUNTER IS NULL THEN V_COUNTER:=0;
END IF;
V_StartValue:=V_COUNTER+1;
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
END IF;
************************ END OF GET LAST COUNTER USED
****************************
***************************** IF SEQUENCE EXISTS
**********************************
FROM USER_SEQUENCES WHERE SEQUENCE_NAME=:SN'; V_SelectStatement:= REPLACE(V_SelectStatement,'^',V_Tables(V_LoopCounter).KeyField);V_SelectStatement:= REPLACE(V_SelectStatement,'!',V_Tables(V_LoopCounter).TableName); V_Sequence_Name:='SEQ';
V_Sequence_Name:=CONCAT(V_Sequence_name,V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_SelectStatement, DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(V_CursorID, 1, V_Sequence_Name,25);
DBMS_SQL.BIND_VARIABLE(V_CursorID,':SN',V_Sequence_Name);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
V_FoundSequence:='No';
LOOP
IF DBMS_SQL.FETCH_ROWS(V_CursorID)>0 THEN
DBMS_SQL.COLUMN_VALUE(V_CursorID, 1, V_Sequence_Name);
V_FoundSequence:='Yes';
ELSE
EXIT;
END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
END IF;
**************************** END IF SEQUENCE EXISTS
V_DropString:= 'DROP SEQUENCE TIMADMIN.SEQ^'; V_DropString:= REPLACE(V_DropString,'^',V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_DropString, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
END IF;
END IF;
DBMS_SQL.PARSE(V_CursorID, V_CreateString, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
V_CursorID :=DBMS_SQL.OPEN_CURSOR;
V_Permissions:=
'GRANT SELECT ON TIMADMIN.SEQ^ TO TIMUSER';
V_Permissions:= REPLACE(V_Permissions,'^',V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_Permissions, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
END IF;
/****************************** IF TABLE SYNONYM EXIST
**********************************/
V_CursorID := DBMS_SQL.OPEN_CURSOR;
V_SelectStatement:= 'SELECT O.NAME, O.OBJ#, O.TYPE#, S.NAME, S.OBJ#
FROM SYS.SYN$ S, SYS.OBJ$ O WHERE O.OBJ# = S.OBJ# AND O.TYPE#=5 AND O.NAME=:SYN';
V_Synonym_Name:=V_Tables(V_LoopCounter).TableName;
DBMS_SQL.PARSE(V_CursorID, V_SelectStatement, DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(V_CursorID, 1, V_Synonym_Name,30);
DBMS_SQL.BIND_VARIABLE(V_CursorID,':SYN',V_Synonym_Name);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
V_FoundSynonym:='No';
LOOP
IF DBMS_SQL.FETCH_ROWS(V_CursorID)>0 THEN
DBMS_SQL.COLUMN_VALUE(V_CursorID, 1, V_Synonym_Name);
V_FoundSynonym:='Yes';
ELSE
EXIT;
END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
/**************************** END IF TABLE SYNONYM EXISTS
********************************/
/**************************** DROP EXISTING TABLE SYNONYM
********************************/
V_DropString:= 'DROP PUBLIC SYNONYM ^';
V_DropString:= REPLACE(V_DropString,'^',V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_DropString, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
END IF;
/*************************** END DROP EXISTING TABLE SYNONYM
****************************/
/**************************** CREATE THE NEW TABLE SYNONYM
******************************/
V_CursorID:= DBMS_SQL.OPEN_CURSOR;
V_CreateString:=
'CREATE PUBLIC SYNONYM ^
FOR TIMADMIN.^';
V_CreateString:= REPLACE(V_CreateString,'^',V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_CreateString, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
/************************** END CREATE THE NEW TABLE SYNONYM
*****************************/
/******************************* STARTING SEQUENCE SYNONYMS
***********************************/
/****************************** IF SEQUENCE SYNONYM EXIST
**********************************/
V_CursorID := DBMS_SQL.OPEN_CURSOR;
V_SelectStatement:= 'SELECT O.NAME, O.OBJ#, O.TYPE#, S.NAME, S.OBJ#
FROM SYS.SYN$ S, SYS.OBJ$ O WHERE O.OBJ# = S.OBJ# AND O.TYPE#=5 AND O.NAME=:SYN';
V_Synonym_Name:='SEQ';
V_Synonym_Name:=CONCAT(V_Synonym_name,V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_SelectStatement, DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(V_CursorID, 1, V_Synonym_Name,30);
DBMS_SQL.BIND_VARIABLE(V_CursorID,':SYN',V_Synonym_Name);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
V_FoundSynonym:='No';
LOOP
IF DBMS_SQL.FETCH_ROWS(V_CursorID)>0 THEN
DBMS_SQL.COLUMN_VALUE(V_CursorID, 1, V_Synonym_Name);
V_FoundSynonym:='Yes';
ELSE
EXIT;
END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
/**************************** END IF SEQUENCE SYNONYM EXISTS
********************************/
/**************************** DROP EXISTING SEQUENCE SYNONYM
********************************/
V_DropString:= 'DROP PUBLIC SYNONYM SEQ^'; V_DropString:= REPLACE(V_DropString,'^',V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_DropString, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
END IF;
/*************************** END DROP EXISTING SEQUENCE SYNONYM
****************************/
/**************************** CREATE THE NEW SEQUENCE SYNONYM
******************************/
V_CursorID:= DBMS_SQL.OPEN_CURSOR;
V_CreateString:=
'CREATE PUBLIC SYNONYM SEQ^
FOR TIMADMIN.SEQ^';
V_CreateString:= REPLACE(V_CreateString,'^',V_Tables(V_LoopCounter).TableName);
DBMS_SQL.PARSE(V_CursorID, V_CreateString, DBMS_SQL.V7);
V_Dummy:=DBMS_SQL.EXECUTE(V_CursorID);
DBMS_SQL.CLOSE_CURSOR(V_CursorID);
/************************** END CREATE THE NEW SEQUENCE SYNONYM
*****************************/
END LOOP;
END;
/
DECLARE
*
ERROR at line 1:
ORA-00955: name is already used by an existing object ORA-06512: at "SYS.DBMS_SYS_SQL", line 826 ORA-06512: at "SYS.DBMS_SQL", line 32 ORA-06512: at line 672
Elapsed: 00:01:10.02
SPOOL OFF
I want to have it print all the variables and the iteration number.
How can I do this?
Thanks...Dan'l Received on Fri Feb 13 2004 - 13:30:32 CST