===============
Solution
dineshmurs,
there's a couple of problems with your pl/sql block:
1.) As shammat already stated, you have to use "EXECUTE IMMEDIATE" for DDL statements in PL/SQL
2.) As it-iss stated, SYS_ named indexes should be avoided (they are not guaranteed to have the same name after i.e. exporting/importing a table)
3.) The "IF indexname != <whatever>" should be moved into the query for performance reasons
4.) In the query you should exclude LOB-indexes to avoid ORA-22864 errors
5.) Looping over cursors is one of the most efficient performance killers in PL/SQL.
The reason is, that every loop cycle generates 2 context switches (PLSQL->SQL and back).
Usually you will gain factors in performance by looping over a PL/SQL table instead.
6.) You should code this as stored procedure to avoid n SQL*Net roundtrips when deleting n indexes
My take on that (ignoring my own advise #6) would be:
Code:
-- tested on 11.2.0.1.0
DECLARE
type tIndArr is table of user_indexes%rowtype index by pls_integer;
cursor indexCursor IS
SELECT *
FROM user_indexes
WHERE table_name = 'TEST'
AND index_name != 'PK_TEST' -- index implementing the primary key, like your SYS_C0014096
AND index_type != 'LOB'; -- avoid ORA-22864 on LOB indexes
vIndArr tIndArr;
vCmdStr varchar2(4000);
BEGIN
OPEN indexCursor;
FETCH indexCursor bulk collect into vIndArr;
CLOSE indexCursor;
if vIndArr.COUNT > 0 then
for i in vIndArr.FIRST..vIndArr.LAST loop
vCmdStr := 'DROP INDEX ' || vIndArr(i).index_name;
dbms_output.put_line('About to execute: ' || vCmdStr);
execute immediate vCmdStr;
END LOOP;
end if;
END;
FROM
http://www.dbforums.com/oracle/1655591-getting-problem-while-executing-procedure.html