Я пытаюсь написать тестовый скрипт 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-запросе также не работает. Такая же ошибка.
Если вы используете 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;