Oracle - 将存储过程复制到远程数据库

Posted

技术标签:

【中文标题】Oracle - 将存储过程复制到远程数据库【英文标题】:Oracle - copying stored procedures to remote database 【发布时间】:2014-06-08 09:40:39 【问题描述】:

作为我 pl/sql 研究的一部分,我的一项任务要求我创建一个远程数据库连接并将我的所有表从本地复制到它,然后还复制我的其他引用数据的对象,因此我的视图和触发器等等

这个想法是,在远程端,如果本地数据库在线,视图等应该引用本地表,如果不在线,那么它们应该引用存储在远程数据库上的表。

所以我创建了一个连接,以及一个在远程端创建表的脚本。

我还制作了一个 pl/sql 块来在远程端创建所有视图和触发器,从而对本地数据库运行一个简单的选择查询以检查它是否在线,如果它在线则一系列的执行立即语句创建参考 table_name@local 的视图等,如果它不在线,则块跳到异常部分,其中类似的一系列执行立即语句创建相同的视图,但引用远程表。

好的,这就是我不确定的地方。 我有一个包含一些过程和一个函数的包,我不确定在远程端创建它的最佳方法是什么,以便它在从何处获取参考表时以类似的方式运行。

这仅仅是将整个包创建块包含在“立即执行”中的一种情况,就像我对视图所做的那样,还是应该创建两个不同的包并将它们称为 pack1 和 pack1_remote 之类的东西?

或者我怀疑是否有更有效的方法来实现目标?

干杯!

【问题讨论】:

让我们调用本地数据库 A 和远程数据库 B。您想在 B 中创建对象。您似乎是说如果 A 在线,您希望 B 中的对象引用 A 中的表否则使用 B 中的对象。准确吗?如果是这样,您是否尝试在编译时做出该决定?还是在运行时?在编译时做出这个决定没有什么意义,因为那是一个时间点,你可以确保 A 在那个时候启动。在运行时做出选择可能很有用,但会排除视图的使用(除其他外)。 如果您试图在运行时做出决定,那么您设计的系统不正确。您希望在数据库之间构建复制,以便数据保持同步并且代码始终可以引用本地对象。这是一个更稳定、更高效、更易于维护的解决方案。 我不确定贾斯汀是否会告诉你真相。也许这个想法是应该在用户会话开始时运行进行在线/离线测试的脚本。我没有太多细节。尽管这可能不是最稳定的方法,但您对存储过程/包有什么想法吗? 你想在编译时做一次决定吗?还是在运行时?这两种方法将是完全不同的。我想,当用户登录时重新安装所有应用程序对象是可能的,但在这么多不同的级别上会很疯狂。如果你只是学习 PL/SQL,我觉得这些都不是对作业的合理解释。 我最好的猜测是编译时一次.. 【参考方案1】:

这绝对不是现实世界中任何理性的人会设计系统的方式。建议像我在现实世界中建议的那样,在最好的情况下,会让你笑出房间。

我能想到的最不疯狂的方法是拥有两种不同的模式。模式 1 将拥有这些表。模式 2 将拥有代码。在安装时,为模式 2 需要引用的每个对象创建同义词。如果安装代码时远程数据库可用,请创建引用远程数据库中对象的同义词。否则,创建引用本地数据库中对象的同义词。通过在代码和表之间创建一个额外的间接层,您可以在不使用动态 SQL 的情况下创建一组对象。

【讨论】:

以上是关于Oracle - 将存储过程复制到远程数据库的主要内容,如果未能解决你的问题,请参考以下文章

通过oracle dblink,怎么执行远程数据库的存储过程。或者说可以执行吗?怎么弄?

使用命令将存储过程查询从 sql 文件导入 Oracle DB

将图像从客户端 pc 又名 Oracle 中的 Java 函数复制到 BLOB

oracle存储过程

在 Oracle 存储过程中访问另一个用户的表

怎么把本地的存储过程导入oracle到数据库