-
insert into TabLink@dblink select id, func(id) from TabLocal
-- id - number -- func(id) - function return number
-- ошибка ORA-02069 -- для данной операции параметр global_names должен быть true делаю ALTER SESSION set global_names = true -- ошибка ORA-02085 -- Ссылка на базу данных [dblink] соединяется с [XXX]
при этом
insert into TabLink@dblink select id, id from TabLocal работает
Можно, как вариант, заполнить временную таблицу. А потом просто insert into TabLink@dblink select * from эта временная таблица. Но это "топорно"..
Что может быть и что можно сделать? (func завраплена)
-
1. версию Oracle указать; 2. функцию - rewrap; 3. function definition; 4. func работает, если вызвать в pl/sql?
ну, а дело скорее всего в том, что func - non-deterministic, т.е. конкретно так зависит от объектов текущей базы.
-
ах, да - что делать? а вот:
for g in (select d.id, func(d.id) func from TabLocal d)
loop
insert into TabLink@dblink values (g.id, g.func);
end loop;
-
1. версию Oracle указать; 10g 2-3. да.. все приводить нет смысла, наверное, там выборка из удаленной таблицы по другому dblink(отличному от моего) присутствует 4. func работает, если вызвать в pl/sql? Да
> for g in (select d.id, func(d.id) func from TabLocal d) > loop > insert into TabLink@dblink values (g.id, g.func); > end loop; >
ну... это не интересно :)
Но, наверное, придется как то так. Или все же во временную сначала. Что-то мне кажется, что по линку каждую запись гонять в курсоре будет дольше.
В любом случае ,Спасибо
-
>AV © (12.04.12 16:26) [3] 1. в версии как минимум три точки и это важно; 2-3 при работе с dblink типы входных и возвращаемых значений играют. ну, партизаньте - дело Ваше)
>Или все же во временную сначала. Что-то мне кажется, что по линку >каждую запись гонять в курсоре будет дольше. временная таблица здесь вообще ни к селу
-
> Кщд (13.04.12 09:56) [4]
function GET_CURR_ALL(ID in Number) return Number is
3 курсора, крутятся вложенно. Честно сказать - не понимаю что делают, один по удаленной таблице. select <number> from where <number> = <number> его значение используется для внешнего все это вычисляет 3 переменные, типа number выход - они же,3 переменные, типа number, склеены по принципу X*1 000 000 + Y*1000 +Z, т.е. в один number
SQL> show release release 1002000400
> временная таблица здесь вообще ни к селу
согласен, некрасиво.
вот так работает create table TMP_TABLE_FOR_TabLink as select id, func(id) from TabLocal; insert into TabLink@dblink select * from TMP_TABLE_FOR_TabLink; (и drop TMP_TABLE_FOR_TabLinkпотом) 13:09:47 start 15:29:04 stop т.е. 2 часа 20 минут
курсором 2-30 работало, потом прервал. Понимаю, что это мало в %% и сервер мог быть загружен именно в это время в этом месте. Но что -то мне не нравится курсорное решение.
-
переписал, запустил
declare cnt number; begin cnt := 0; for g in (select FROM TabLocal) loop insert into TabLink@dblink () values (g...); cnt := cnt + 1; if mod(cnt,1000) = 0 then commit; end if; end loop; commit; end;
20 минут, 5 000 записей.. за 2-20 из временной over 500 000 делалось...
|