我正在尝试编写一个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查询中也不起作用。同样的错误。
答案 0 :(得分:1)
如果您使用的是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;