Как получить удаленный результат sysdate через ссылку на базу данных?

Я запускаю запрос через ссылку базы данных на сервер Sybase от Oracle.

В предложении where есть ограничение на дату, и я хочу, чтобы оно было привязано к sysdate, так что-то вроде этого:

выберите * из some_remote_view, где some_numeric_key = 1 и some_date > sysdate+2

Проблема в том, что когда я объясняю план, только условие some_numeric_key = 1 отображается в фактическом sql, который удален на сервер sybase. Oracle ожидает, что фильтр даты будет выполняться на его стороне.

Это вызывает кошмар производительности - мне нужно, чтобы этот фильтр даты был удален, чтобы этот запрос работал быстро

Даже если я попробую что-то вроде приведения sysdate к строке charcater, например: to_char(sysdate-2,'YYYY-MM-DD')

Это все еще не удаленно.

Есть ли что-нибудь, что я могу сделать, чтобы заставить Oracle удалить этот фильтр даты через ссылку db на Sybase?


person Trant    schedule 14.08.2014    source источник
comment
Радости ссылок БД. Не много знаю о SYbase, но когда я сталкиваюсь с похожими проблемами Oracle-Oracle, я смотрю, могу ли я управлять результатами из представления в удаленной базе данных, которое обычно обеспечивает удаленную фильтрацию. Если для запроса/представления требуется параметр, можно вывести его из подходящей таблицы для этого конкретного запроса на удаленной базе данных, сначала вставив данные параметра перед запуском запроса.   -  person TenG    schedule 15.08.2014


Ответы (1)


Выполняя интеграцию между Oracle и другими платформами, я часто сталкиваюсь с этой проблемой не только с SYSDATE, но и с другими нестандартными функциями.

Есть два метода решения проблемы, первый из которых, по моему опыту, самый надежный.

Во-первых, вы можете создать представление на удаленной БД с нужными вам фильтрами, затем на стороне Oracle вы просто выбираете из нового представления без дополнительных фильтров.

Во-вторых, если вам не разрешено создавать объекты на удаленной стороне, попробуйте использовать переменные связывания (правильного типа данных!) в своем операторе Oracle SELECT, например:

declare
   v_some_date constant date := sysdate + 2;
begin
    insert into oracle_table (...)
    select ...
      from remote_table@db_link t
     where t.some_numeric_key = 1
       and t.some_date > v_some_date;

    commit;
end;
/
person Marco Baldelli    schedule 15.08.2014