2014-12-17 2 views
1

Я пытаюсь запустить набор запросов по DBLink, который определяется во время выполнения (из конфигурации или другого ввода). Я видел много примеров, предлагающих использовать динамический SQL и EXECUTE IMMEDIATE. Я хотел бы попытаться избежать этого любой ценой, так как мои запросы длинны и могут измениться, поэтому размещение их в строке упростит обслуживание.Динамический DBLink в Oracle

Я попытался имея мои запросы ссылки на синонимы, а затем просто обновить синоним до выполнения запроса:

EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM my_tbl_s FOR my_tbl_t' || p_dblink_name; 

SELECT * FROM my_tbl_s; 

Это работает, но я хочу использовать это в пакете, так что, когда я исполняю создать синоним пакета недействителен. Я также попытался отделяя свой код в различные пакеты и recompling после обновления синонимов:

EXECUTE IMMEDIATE 'ALTER PACKAGE my_pck COMPILE'; 

Однако первоначальный пакет вызова по-прежнему признан недействительный. Может ли кто-нибудь подумать о способе достижения динамических связей БД без использования динамического SQL?

+0

На самом деле, я думаю, что одна и та же концепция будет работать с использованием VIEWS вместо SYNONYM. Я не верю, что обновление представления приведет к аннулированию ссылочного пакета. Нужно проверить ... – Paul

ответ

4

Я бы изменил свое отношение к динамическому SQL, если бы был вами. Вместо этого вы пытаетесь сделать вашу жизнь проще, чем хранить запросы в строке.

Dynamic DDL мощь (в теории) держать ваш SQL статическим, однако, у него есть один существенный недостаток, который является Deal Breaker в одиночку - это не является транзакционной, что означает, каждый раз, вы вызовете execute immediate 'create or replace something' - Вы обязуетесь.

Хорошо, скажите, что вы каким-то образом справитесь с этим с помощью автономных транзакций - и тогда мы сразу столкнемся с проблемой параллелизма: что произойдет, когда две параллельные транзакции будут пытаться перезаписать один и тот же синоним? Что происходит, когда их 10? Вы получаете узкое место.

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

Или вы можете заменить таблицу с точки зрения, как:

create view tab as 
select 1 as dblink, t.* as [email protected] union all 
select 2 as dblink, t.* as [email protected] 

В этом случае, скорее всего, вы получите N-уровневой распределенной транзакции каждый раз, когда вы запрашиваете эту точку зрения, и должны быть уверены, что все dblinks находятся в режиме онлайн, и их число должно быть меньше, чем OPEN_LINKS параметр, который контролирует максимальное количество открытых подключений за сеанс.

Множество сложных вещей, которые вы на самом деле не должны учитывать при создании СУБД, много возможностей для чего-то сломать. Обработка строк проще, и что более важно, это то, что вы должны делать по дизайну в этих случаях.

Смежные вопросы