The problem of listing indexes for a table is much the same as that of listing constraints on a table. You have a master-detail relationship between the index and its columns , and you may have multiple indexes on one table.
To list only the indexes on a table, query the all_indexes view:
SELECT index_name, index_type, uniqueness FROM all_indexes WHERE owner = UPPER('&owner') AND table_name = UPPER('&table_name');
Listing the indexes alone is seldom enough. You need to know at least the columns involved in each index. To that end, join with all_ind_columns . Example 10-8 shows the query.
Example 10-8. A script to list all indexes on a table
COLUMN index_name FORMAT A20 COLUMN index_type FORMAT A10 COLUMN UNIQUENESS FORMAT A10 COLUMN column_name FORMAT A15 SELECT ai.index_name, ai.index_type, ai.uniqueness, aic.column_name FROM all_indexes ai INNER JOIN all_ind_columns aic ON ai.owner = aic.index_owner AND ai.index_name = aic.index_name WHERE ai.owner = UPPER('&owner') AND ai.table_name = UPPER('&table_name') ORDER BY aic.column_position;
Here's a run of Example 10-8 showing the two indexes on the employee table:
SQL> @ex10-8 Enter value for owner: gennick old 5: WHERE ai.owner = UPPER('&owner') new 5: WHERE ai.owner = UPPER('gennick') Enter value for table_name: employee old 6: AND ai.table_name = UPPER('&table_name') new 6: AND ai.table_name = UPPER('employee') INDEX_NAME INDEX_TYPE UNIQUENESS COLUMN_NAME -------------------- ---------- ---------- --------------- EMPLOYEE_PK NORMAL UNIQUE EMPLOYEE_ID EMPLOYEE_BY_NAME NORMAL NONUNIQUE EMPLOYEE_NAME
One thing to keep in mind when working with unique indexes is that Oracle will report a unique index violation as if it were a constraint violation. The error message you get is the same as the one used when you violate a unique constraint, and it looks like this:
ORA-00001: unique constraint (GENNICK.UNIQUE_BILLING_RATE) violated
The reason for this is no doubt because Oracle enforces unique and primary key constraints by creating indexes on the constrained fields. If you do get the error message just shown, you might want to check two things. First, list the constraints on the table you are updating. Second, if you don't find one with a name that matches the one in the error message, check to see whether there happens to be a unique index with that same name .
Oracle SQL*Plus: The Definitive Guide (Definitive Guides)
Authors: Jonathan Gennick
Simiral book on Amazon
Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Input Validation & More