2016-08-11 2 views
0

Я новичок в 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; 

Может ли кто-нибудь сказать мне, что неправильно, передавая это значение переменной в инструкции выполнения? Я использую TOAD и оракул 11g.

+0

Он всегда помогает включить ошибку, которую вы получаете. У вас просто отсутствует пробел после слова LINK, а один перед словом 'CONNECT'. Таким образом, он становится «CREATE DATABASE LINK» || DBLINK_NAME || «CONNECT ...». (Почему вы хотите или нужно создать ссылку динамически или «на лету», другое дело - создание любого объекта во время выполнения обычно означает, что вы делаете что-то неправильно ...) –

ответ

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, используя эти значения. Возможно, вы намерены превратить это в процедуру. Но создание ссылки во время выполнения было бы необычным.

Смежные вопросы