Конференция "Базы" » ошибка Orcle вставки в таблицу по dblink с использованием функции
 
  • AV © (12.04.12 11:39) [0]
    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 завраплена)
  • Кщд (12.04.12 14:16) [1]
    1. версию Oracle указать;
    2. функцию - rewrap;
    3. function definition;
    4. func работает, если вызвать в pl/sql?

    ну, а дело скорее всего в том, что func - non-deterministic, т.е. конкретно так зависит от объектов текущей базы.
  • Кщд (12.04.12 14:18) [2]
    ах, да - что делать?
    а вот:

    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. версию 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;
    >

    ну...
    это не интересно :)

    Но, наверное, придется как то так.
    Или все же во временную сначала. Что-то мне кажется, что по линку каждую запись гонять в курсоре будет дольше.

    В любом случае ,Спасибо
  • Кщд (13.04.12 09:56) [4]
    >AV ©   (12.04.12 16:26) [3]
    1. в версии как минимум три точки и это важно;
    2-3 при работе с dblink типы входных и возвращаемых значений играют.
    ну, партизаньте - дело Ваше)

    >Или все же во временную сначала. Что-то мне кажется, что по линку >каждую запись гонять в курсоре будет дольше.
    временная таблица здесь вообще ни к селу
  • AV © (13.04.12 13:03) [5]

    > Кщд   (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 работало, потом прервал.
    Понимаю, что это мало в %% и сервер мог быть загружен именно в это время в этом месте.
    Но что -то мне не нравится курсорное решение.
  • AV © (13.04.12 17:52) [6]
    переписал, запустил

    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 делалось...
 
Конференция "Базы" » ошибка Orcle вставки в таблицу по dblink с использованием функции
Есть новые Нет новых   [134431   +9][b:0][p:0.001]