SQL脚本中的变量DB名称

时间:2018-01-08 14:41:44

标签: mysql sql oracle plsql

我正在尝试编写一个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查询中也不起作用。同样的错误。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Oracle,则可能需要使用EXECUTE IMMEDIATE的动态DML。

from_dbto_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;