Cơ sở dữ liệu Oracle không bao gồm IF NOT EXISTS
với CREATE TABLE
của nó , giống như một số DBMS khác.
Do đó, nếu chúng tôi không muốn tạo ra lỗi do tên bảng đã được sử dụng, chúng tôi cần sử dụng các phương pháp khác để kiểm tra sự tồn tại của bảng.
Tùy chọn 1:Kiểm tra DBA_TABLES
Xem
DBA_TABLES
là một dạng xem từ điển dữ liệu 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 đã tồn tại hay chưa, sau đó chỉ chạy CREATE TABLE
tuyên bố nếu nó chưa tồn tại.
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:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
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 tạo vì không có bảng nào có tên t1
.
Bây giờ, nếu chúng ta cố gắng tạo lại bảng, chúng ta sẽ nhận được cùng một kết quả mà thủ tục PL / SQL đã hoàn tất thành công và sẽ không có lỗi.
Tuy nhiên, nếu chúng tôi chỉ cố gắng tạo bảng mà không kiểm tra sự tồn tại của nó trước, chúng tôi sẽ gặp lỗi:
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
);
Kết quả:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
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 CREATE TABLE
và sau đó bắt bất kỳ lỗi ORA-00955 nào xảy ra. Cụ thể, chúng tôi bắt gặp bất kỳ lỗi SQLCODE -955 nào xảy ra.
Ví dụ:
DECLARE
sql_stmt long;
BEGIN
sql_stmt:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL;
ELSE
RAISE;
END IF;
END;
Kết quả:
PL/SQL procedure successfully completed.
Tôi đã chạy nó ngay cả khi T1
bảng đã tồn tại. Lỗi ORA-00955 đã được phát hiện và xử lý, vì vậy chúng tôi không nhận được thông báo lỗi và bảng chưa được tạo.
Nếu bảng chưa tồn tại, bảng sẽ được tạo và chúng ta sẽ thấy cùng một kết quả.