如何动态创建数据库链接

时间:2016-08-11 09:54:19

标签: oracle11g

我是oracle db的新手...... 我需要通过将链接名称和连接字符串作为变量传递来创建数据库链接。

DECLARE DBLINK_NAME varchar(100) :='newdblink';
Connection varchar(250) := '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=host.name.com)(Port=1521))(CONNECT_DATA=(SID=host)))';
BEGIN
EXECUTE IMMEDIATE 'CREATE DATABASE LINK' ||DBLINK_NAME||
'CONNECT TO SCHEMA_NAME IDENTIFIED BY password USING '||Connection;
END;

任何人都可以告诉我在execute语句中传递这个变量值有什么问题吗? 我正在使用TOAD和oracle 11g。

1 个答案:

答案 0 :(得分:0)

您错过了数据库链接名称周围的空格,因此您的命令最终为:

CREATE DATABASE LINKnewdblinkCONNECT TO ...

会产生ORA-01501: CREATE DATABASE failed错误。您需要在LINK之后和CONNECT之前添加空格。

你的连接字符串也需要用单引号括起来,所以你需要连接它们,并且需要对它们进行转义:

DECLARE
  DBLINK_NAME varchar(100) :='newdblink';
  Connection varchar(250) := '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=host.name.com)(Port=1521))(CONNECT_DATA=(SID=host)))';
BEGIN
  EXECUTE IMMEDIATE 'CREATE DATABASE LINK ' || DBLINK_NAME
    || ' CONNECT TO SCHEMA_NAME IDENTIFIED BY password USING '''
    || Connection || '''';
END;
/

PL/SQL procedure successfully completed.

使用dbms_output准确显示execute immediate将尝试运行的内容会很有帮助。您经常可以快速发现错误 - 缺少的空间非常明显 - 并且可以复制并修补生成的语句以将其作为纯SQL运行,这有时会使其他问题变得更加明显。

我不确定使用PL / SQL,变量和动态SQL的好处是什么。您可以使用这些值来执行简单的SQL语句。也许你打算把它变成一个程序。但是在运行时创建一个链接是不寻常的。