2012-02-08 11 views
5

Devo controllare se esiste già un collegamento al database prima di crearne uno. Come lo posso fare?Collegamento al database Oracle. Verifica esistenza o sovrascrittura?

Sto scrivendo uno script SQL che inizia con questo:

DROP DATABASE LINK mydblink 

poi crearne uno:

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

sarò ovviamente un errore nella prima fase se il database link doesn esiste E se ometto il primo passaggio e procedo e creo un collegamento db, visualizzerò nuovamente un errore che dice che esiste già con lo stesso nome.

Cosa posso fare per verificare se il collegamento al database esiste già?

risposta

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

Per esempio (non testata):

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

Non ho restituito nulla da questa query anche se ho appena creato un collegamento. Cosa conta (1)? –

+1

Perché non 'USER_DB_LINKS' ?? – Gaius

+0

Il conteggio di @OliverNilsen (1) è identico al conteggio (*). Avrei potuto dire contare ('Oliver') o contare ('tbone'). – tbone

0

Oracle non ha modo di verificare l'esistenza prima di una goccia o CREATE. (Bene, ok, potresti scrivere un po 'di PL/SQL, ma probabilmente sono più problemi di quanti ne valga la pena.) Nello scripting Oracle, è piuttosto semplice eseguire sia DROP che CREATE in uno script. Se il DROP viene eliminato, così sia. Non influenzerà l'esecuzione dello script.

-Mark

+0

Ho provato a eseguirlo come script. Quando raggiunge l'istruzione DROP DATABASE LINK fallisce e il resto dello script non viene eseguito. Puoi darmi un suggerimento su cosa potrei fare in PL/SQL? –

+0

Il tuo script ha una clausola 'when sqlerror ...'? Perché se lo fai, sta causando l'uscita. Se metti un po 'di DROP/CREATE in uno script e lo esegui in SQL * Plus, dovrebbe funzionare. Vedrò di aggiornare la mia risposta con l'esempio PL/SQL. –