Ответ обсуждается здесь: http://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069
В случае, если ссылка не работает:
Ошибка:
ORA-02069: для параметра global_names должно быть установлено значение TRUE для этой операции
Причина:
Вы пытаетесь выполнить операцию DML на удаленной базе данных с помощью локальной функции.
Это «ошибка Oracle», она должна работать, но это не так.
Пример (для лучшего понимания):
- предположим, что у нас есть две базы данных DB1 и DB2
- На DB1 у нас есть функция fun1
create function fun1 return number is
begin
return 1;
end;
- На DB1 у нас есть ссылка на базу данных, ссылающаяся на DB2, которая для простоты называется DB2.
–Проверьте, работает ли он.
select *
from dual@DB2
- Если вывод следующий, то он работает.
DUMMY
-----
X
–Позволяет создать тестовую таблицу в DB2 (подключиться к базе данных DB2)
create table tesTable(
id number,
testColumn number
);
- позволяет выполнить некоторую операцию DML, которая должна вызвать эту ошибку ORA-02069.
insert into testable@DB2(id,testColumn)
values(1, fun1);
“ORA-02069: global_names parameter must be set to TRUE for this operation”
Теперь, когда вы уже знаете, в какой ситуации возникает эта ошибка, давайте напишем решение. У него есть два решения:
Решение первое:
- Установите для параметра global_names значение true, это можно сделать на системном уровне или уровне сеанса (учитывая, что уровень сеанса иногда недоступен)
- на DB1
alter session set global_names=true;
- Создайте ссылку на базу данных в удаленной базе данных, в нашем случае на DB2, которая будет ссылаться на базу данных DB1 (сделайте имя ссылки таким же, как глобальное имя базы данных, потому что для параметра global_names в значение true это требуется).
–на DB2
Create database link DB1 connect to <username> identified by <password>
using ‘DB1’;
Теперь это должно работать, но я должен отметить, что создание ссылки на базу данных может быть не предпочтительным,
потому что это небезопасно (вы должны догадаться почему, потому что, если вы сделаете это, вы сможете
подключитесь к DB1 с каким-либо пользователем через ссылку на базу данных ... если это не имеет значения для вас, используйте ееJ).
Решение второе:
- Создать временную таблицу в локальной базе данных.
- Вставить строку во временную таблицу.
- Вставить временную строку из временной таблицы в удаленную базу данных.
- Удалить временную строку.
Обратите внимание, что это решение медленнее, чем первое. Но это также решает проблему и является намного более безопасным.