Имя переменной БД в скрипте SQL

0

Я пытаюсь написать тестовый скрипт SQL, который принимает четыре переменные и создает SQL-запрос, который я могу легко скопировать/вставить в целевую БД. Я использую слияние для этого и пытаюсь сделать 4 переменные динамическими:

declare
  from_id       VARCHAR2(242);
  to_id         VARCHAR2(242);
  from_db       VARCHAR2(242);
  to_db         VARCHAR2(242);
  admin_account VARCHAR2(242);
begin
 from_id       := '123';
 to_id         := '234';
 from_db       := 'db1';
 to_db         := 'db2';

MERGE INTO (select * from tablename@to_db
              where id = to_id) T
 USING (SELECT * from tablename@from_db
         where id = from_id) S
  ON ( .... )
  WHEN MATCHED THEN
    UPDATE
    SET ....
  WHEN NOT MATCHED THEN
    INSERT
      (...)
    VALUES
      (...);

Проблема в том, что tablename @to_db и tablename @from_db дают мне ошибки, говоря, что таблица не существует. Похоже, что он не преобразовывает "tablename @to_db" в "tablename @db2", как будто он преобразует "to_id" в "234".

Кто-нибудь знает, как сделать динамическое имя удаленного динамического?

Спасибо

ОБНОВИТЬ:

Использование "to_db = tablename @db2" и установка "FROM to_db" в SQL-запросе также не работает. Такая же ошибка.

Теги:
plsql

1 ответ

1

Если вы используете Oracle, вам может понадобиться динамический DML, используя EXECUTE IMMEDIATE.

from_db и to_db переменные должны быть объединены (||) в цитируемый sql.

declare
  from_id       VARCHAR2(242);
  to_id         VARCHAR2(242);
  from_db       VARCHAR2(242);
  to_db         VARCHAR2(242);
  admin_account VARCHAR2(242);
BEGIN
 from_id       := '123';
 to_id         := '234';
 from_db       := 'db1';
 to_db         := 'db2';

EXECUTE IMMEDIATE 'MERGE INTO (select * from tablename@'||to_db||
              'where id = to_id) T
 USING (SELECT * from tablename@'||from_db||
         'where id = from_id) S
  ON (....)
  WHEN MATCHED THEN
    UPDATE
    SET ....
  WHEN NOT MATCHED THEN
    INSERT
      (...)
    VALUES
      (...)';

 END;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню