2012-02-08 9 views
5

Tôi cần kiểm tra xem liên kết cơ sở dữ liệu đã tồn tại chưa trước khi tạo. Làm thế nào tôi có thể làm điều đó?Liên kết cơ sở dữ liệu Oracle. Kiểm tra sự tồn tại hoặc ghi đè?

Tôi viết một kịch bản SQL bắt đầu với điều này:

DROP DATABASE LINK mydblink 

sau đó tôi có thể tạo một:

CREATE DATABASE LINK mydblink 
CONNECT TO testuser 
IDENTIFIED BY mypswd 
USING 'mypersonaldb' 

tôi sẽ tất nhiên nhận được một lỗi trong bước đầu tiên nếu liên kết cơ sở dữ liệu doesn không tồn tại. Và nếu tôi bỏ qua bước đầu tiên và chỉ cần tiếp tục và tạo một liên kết db, tôi sẽ lại gặp lỗi khi nói rằng nó đã tồn tại với cùng một tên.

Tôi có thể làm gì để kiểm tra xem liên kết cơ sở dữ liệu đã tồn tại chưa?

Trả lời

8
select count(1) from dba_objects where object_type = 'DATABASE LINK' and object_name = 'ARGUS51P'; 

Ví dụ (chưa được kiểm tra):

declare 
    l_link_cnt pls_integer := 0; 
    l_sql varchar2(32767); 
begin 
    -- link creation sql (fill in details of how you want this created) 
    l_sql := 'create public database link ...'; 

    select count(1) 
    into l_link_cnt 
    from dba_objects 
    where object_type = 'DATABASE LINK' 
    and object_name = 'SOME_LINK'; 

    -- create link if it doesn't exist yet 
    if (l_link_cnt = 0) then 
    -- create link 
    execute immediate l_sql; 

    end if; 

end; 
+0

Tôi không có gì được trả lại từ truy vấn này mặc dù tôi vừa tạo liên kết. Số đếm (1) làm gì? –

+1

Tại sao không phải 'USER_DB_LINKS' ?? – Gaius

+0

@OliverNilsen đếm (1) thực sự giống như đếm (*). Tôi có thể nói số đếm ('Oliver') hoặc đếm ('tbone'). – tbone

0

Oracle không có cách nào để kiểm tra sự tồn tại trước sự sụt giảm hoặc CREATE. (Vâng, ok, bạn có thể viết một số PL/SQL, nhưng, đó có thể là rắc rối nhiều hơn nó có giá trị.) Trong kịch bản Oracle, nó khá chuẩn để chỉ cần làm cả DROP và CREATE trong một kịch bản. Nếu các lỗi DROP ra, do đó, được nó. Nó sẽ không ảnh hưởng đến việc thực thi kịch bản.

-Mark

+0

Tôi đã thử chạy nó dưới dạng tập lệnh. Khi nó chạm DROP DATABASE LINK, nó không thành công, và phần còn lại của tập lệnh không được thực thi. Bạn có thể cho tôi gợi ý những gì tôi có thể làm trong PL/SQL không? –

+0

Tập lệnh của bạn có mệnh đề 'bất cứ khi nào sqlerror ...'? Nguyên nhân nếu bạn làm, điều đó gây ra lối ra. Nếu bạn chỉ cần đặt một loạt các DROP/CREATE trong một kịch bản và chạy nó trong SQL * Plus, nó sẽ làm việc. Tôi sẽ xem xét cập nhật câu trả lời của tôi với ví dụ PL/SQL. –