Cơ sở dữ liệu Oracle không bao gồm IF EXISTS
mệnh đề mà một số DBMS khác cung cấp trong DROP TABLE
của chúng các câu lệnh. Do đó, nếu chúng ta muốn tránh bất kỳ lỗi khó chịu nào do cố gắng bỏ một bảng không tồn tại, chúng ta cần phải thực hiện thêm một chút công việc.
Tùy chọn 1:Kiểm tra xem Bảng có tồn tại không
Chúng tôi có thể kiểm tra DBA_TABLES
xem từ điển dữ liệu để xem bảng có tồn tại hay không. Dạng xem này mô tả tất cả các bảng quan hệ trong cơ sở dữ liệu. Các cột của nó giống với các cột trong ALL_TABLES
.
Chúng ta có thể kiểm tra bảng này để xem bảng có tồn tại hay không, sau đó chỉ chạy DROP TABLE
nếu có.
Ví dụ:
DECLARE
tbl_count number;
sql_stmt long;
BEGIN
SELECT COUNT(*) INTO tbl_count
FROM dba_tables
WHERE owner = 'HR'
AND table_name = 'T1';
IF(tbl_count <> 0)
THEN
sql_stmt:='DROP TABLE T1';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END;
Kết quả:
PL/SQL procedure successfully completed.
Trong trường hợp này, bảng được gọi là t1
đã tồn tại và đã bị loại bỏ.
Bây giờ, nếu chúng ta chạy lại cùng một mã, chúng ta sẽ nhận được cùng một kết quả:
PL/SQL procedure successfully completed.
Không có lỗi xảy ra, mặc dù bảng không còn tồn tại.
Tuy nhiên, nếu chúng tôi chỉ cố gắng thả bảng mà không kiểm tra sự tồn tại của nó trước tiên, chúng tôi sẽ gặp lỗi:
DROP TABLE T1;
Kết quả:
Error report - ORA-00942: table or view does not exist 00942. 00000 - "table or view does not exist"
Tùy chọn 2:Kiểm tra lỗi
Một cách khác để làm điều đó là chỉ cần tiếp tục và chạy DROP TABLE
và sau đó bắt bất kỳ lỗi ORA-00942 nào xảy ra. Cụ thể, chúng tôi bắt gặp bất kỳ lỗi SQLCODE -942 nào xảy ra.
Ví dụ:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE t1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Kết quả:
PL/SQL procedure successfully completed.
Tôi đã chạy nó ngay cả khi T1
bảng không tồn tại. Lỗi ORA-00942 đã được phát hiện và xử lý nên chúng tôi không nhận được thông báo lỗi.
Nếu bảng đã tồn tại, bảng sẽ bị xóa và chúng ta sẽ thấy cùng một kết quả.