我正在尝试编写一个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"并在 SQL 查询中输入"FROM to_db"也不起作用。同样的错误。
如果您使用的是 Oracle,则可能需要使用 EXECUTE IMMEDIATE
的动态 DML
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;