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