2012-02-08 79 views
5

我需要检查一个数据库链接是否已经存在,然后我创建一个。我怎样才能做到这一点?Oracle数据库链接。检查是否存在或覆盖?

我正在写一开始是这个SQL脚本:

DROP DATABASE LINK mydblink 

然后创建一个:

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

我当然会在第一步中得到一个错误,如果数据库链接没有按不存在。如果我省略了第一步,然后继续创建数据库链接,我将再次得到一个错误,指出它已经存在同名。

我能做些什么来检查数据库链接是否已经存在?

回答

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

例如(未测试):

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

即使我刚刚创建了一个链接,我也没有从此查询返回任何内容。伯爵(1)做了什么? – 2012-02-08 19:58:07

+1

为什么不'USER_DB_LINKS'? – Gaius 2012-02-08 20:05:36

+0

@OliverNilsen计数(1)与count(*)确实相同。我可以说count('Oliver')或者count('tbone')。 – tbone 2012-02-08 20:09:39

0

Oracle有没有办法DROP之前测试对于存在或CREATE。 (好吧,你可以编写一些PL/SQL,但是这可能比它的价值更麻烦)。在Oracle脚本中,简单地在脚本中执行DROP和CREATE是非常标准的。如果DROP出错,那就这样吧。它不会影响脚本的执行。

-Mark

+0

我试着将它作为脚本运行。当它命中DROP DATABASE LINK语句时,它会失败,并且脚本的其余部分不会被执行。你能给我一个提示,我可以在PL/SQL中做什么? – 2012-02-08 20:13:15

+0

您的脚本是否有'每当sqlerror ...'条款?如果你这样做,那会导致退出。如果你只是在脚本中放入一堆DROP/CREATE,并在SQL * Plus中运行它,它应该可以工作。我会看看用PL/SQL例子更新我的答案。 – 2012-02-08 22:41:11