mysql - SQL 脚本中的变量数据库名称

标签 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 查询中也不起作用。同样的错误。

最佳答案

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

关于mysql - SQL 脚本中的变量数据库名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152530/

相关文章:

sql - T-SQL 复制登录名、用户、角色、权限等

java - JDBC取消Oracle存储过程调用

oracle - 完全用PL/SQL编写大型批处理程序是不是很愚蠢?

php - html代码中的printf

mysql sql选择每组中的最后一条记录

mysql - MySQL WHERE 子句中的 CASE 或 COALESCE 性能

performance - 当我为DATE列传递java.sql.Timestamp时,为什么Oracle这么慢?

php - 如何使用 MySQL PHP 将两个表中的数据插入到一个表中

php - MySQL 表/查询设计 - 一项的倍数,许多评论

mysql - CREATE 上的 Hive 错误