2012-02-08 12 views
5

Muszę sprawdzić, czy łącze do bazy danych już istnieje, zanim ją utworzę. Jak mogę to zrobić?Łącze do bazy danych Oracle. Sprawdź istnienie lub nadpisanie?

Piszę skrypt SQL, który zaczyna się tak:

DROP DATABASE LINK mydblink 

następnie utworzyć jeden:

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

będę oczywiście pojawia się błąd w pierwszym etapie, jeśli link w bazie nie robi istnieje. A jeśli pominę pierwszy krok i po prostu utworzę link db, znowu otrzymam komunikat o tym, że już istnieje z tą samą nazwą.

Co mogę zrobić, aby sprawdzić, czy link do bazy danych już istnieje?

Odpowiedz

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

na przykład (nieprzebadanej)

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

Nie mam nic zwróconego z tego zapytania, mimo że właśnie utworzyłem łącze. Co się liczy (1)? –

+1

Dlaczego nie 'USER_DB_LINKS' ?? – Gaius

+0

@OliverNilsen count (1) jest naprawdę taki sam jak count (*). Mogłem powiedzieć, że liczę ("Oliver") lub liczyć ("tbone"). – tbone

0

Oracle nie ma możliwości sprawdzenia istnienia wcześniej spadek lub utworzyć. (No cóż, możesz napisać trochę PL/SQL, ale to chyba więcej kłopotu niż jest warte.) W skryptach Oracle, to całkiem normalne, aby po prostu zrobić zarówno DROP, jak i CREATE w skrypcie. Jeśli pojawią się błędy DROP, niech tak będzie. Nie wpłynie to na wykonanie skryptu.

-Mark

+0

Próbowałem uruchomić go jako skrypt. Kiedy trafi ona w instrukcję DROP DATABASE LINK, zawiedzie, a reszta skryptu nie zostanie wykonana. Czy możesz dać mi wskazówkę, co mogę zrobić w PL/SQL? –

+0

Czy Twój skrypt ma klauzulę "when sqlerror ..."? Bo jeśli to zrobisz, to powoduje wyjście. Jeśli po prostu wstawisz do skryptu pakiet DROP/CREATE i uruchomisz go w SQL * Plus, to powinno działać. Przyjrzę się aktualizacji mojej odpowiedzi za pomocą przykładu PL/SQL. –

Powiązane problemy