2009-03-12 4 views
14

Tôi đang viết một kịch bản nâng cấp lược đồ cho một sản phẩm phụ thuộc vào cơ sở dữ liệu Oracle. Trong một khu vực, tôi cần tạo một chỉ mục trên một bảng - nếu chỉ mục đó không tồn tại. Có một cách dễ dàng để kiểm tra sự tồn tại của một chỉ mục mà tôi biết tên của một kịch bản Oracle?Cách kiểm tra chỉ mục trong Oracle

Nó sẽ là tương tự như sau trong SQL Server: NẾU NOT EXISTS (SELECT * FROM SYSINDEXES WHERE name = 'myIndex') // Sau đó tạo myIndex tôi

Trả lời

30

select count (*) từ USER_INDEXES nơi INDEX_NAME = 'myIndex'

sqlplus sẽ không hỗ trợ IF ..., tuy nhiên, vì vậy bạn sẽ phải sử dụng khối PL/SQL ẩn danh, có nghĩa là THỰC HIỆN NGAY LẬP TỨC để thực hiện DDL.

DECLARE 
    i INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 'MYINDEX'; 
    IF i = 0 THEN 
     EXECUTE IMMEDIATE 'CREATE INDEX myIndex ...'; 
    END IF; 
END; 
/

Chỉnh sửa: như đã chỉ ra, Oracle lưu trữ tên đối tượng không được đặt tên trong tất cả chữ hoa.

+1

Trừ khi bạn trích dẫn chúng, các đối tượng cơ sở dữ liệu (bao gồm các chỉ mục) được lưu trữ trong chữ hoa. Vì vậy, nếu bạn làm một chỉ mục CREATE INDEX, thì trong USER_INDEXES nó sẽ được lưu trữ dưới dạng MYINDEX. Và Oracle (theo mặc định) sẽ không làm các trường hợp không nhạy cảm. –

+1

ngoài câu trả lời này: nếu bạn cần kiểm tra xem một chỉ mục có tồn tại trong một giản đồ khác hay không, hãy truy vấn ALL_INDEXES thay vì sử dụng USER_INDEXES. Việc kiểm tra USER_INDEXES không hoạt động với "ALTER SESSION SET CURRENT_SCHEMA = XYZ", bạn vẫn sẽ truy vấn các chỉ mục cho người dùng hiện đã đăng nhập. – SaschaM78