sql脚本中的变量db name

uinbv5nw  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(361)

我正在尝试编写一个sql测试脚本,它接受四个变量并生成一个sql查询,我可以轻松地将其复制/粘贴到目标db中。我正在使用一个合并来实现这一点,并试图使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 \u db”也不起作用。同样的错误。

des4xlb0

des4xlb01#

如果您使用的是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;

相关问题