Oracle:PL/SQL过程,涉及两个不同数据库中的两个不同模式
我有一个这样的场景,我有一个与此类似的现有过程Oracle:PL/SQL过程,涉及两个不同数据库中的两个不同模式,oracle,stored-procedures,plsql,database-schema,Oracle,Stored Procedures,Plsql,Database Schema,我有一个这样的场景,我有一个与此类似的现有过程 PROCEDURE A_DATA_B( p_ID IN SCHEMA1.TABLE1.ID%TYPE, p_MATCH IN SCHEMA1.TABLE2.MATCH%TYPE, p_STATUS IN SCHEMA1.TABLE3.STATUS%TYPE, p_MSG IN SCHEMA1.TABLE1.MSG%TYPE,
PROCEDURE A_DATA_B( p_ID IN SCHEMA1.TABLE1.ID%TYPE,
p_MATCH IN SCHEMA1.TABLE2.MATCH%TYPE,
p_STATUS IN SCHEMA1.TABLE3.STATUS%TYPE,
p_MSG IN SCHEMA1.TABLE1.MSG%TYPE,
The list goes on...
SCHEMA1以前驻留在同一个数据库中。现在需要将其移动到不同服务器中的另一个数据库中。但是模式名会有所不同,但表名和列名保持不变
所以我把程序改成这样
PROCEDURE A_DATA_B( p_ID IN SCHEMA2.TABLE1.ID%TYPE,
p_MATCH IN SCHEMA2.TABLE2.MATCH%TYPE,
p_STATUS IN SCHEMA2.TABLE3.STATUS%TYPE,
p_MSG IN SCHEMA2.TABLE1.MSG%TYPE,
The list goes on..
但是当我编译时,我得到了错误
PLS-00201:标识符“SCHEMA2.TABLE1”必须声明为PL/SQL:
声明被忽略
我可以从这个错误中理解SCHEMA2不在给出错误的数据库中。那么我应该如何应对呢?
在包体中,我曾经使用过这个SCHEMA2,后面跟着一个@db_链接。那么我可以利用db_链接来解决这个问题吗
通过阅读一些文章,我知道同义词也可以被使用。那么,这是创建同义词的正确方法吗
CREATE SYNONYM SCHEMA2 FOR SCHEMA2@db_link;
有人能帮我这方面的忙吗
注意:我可能无法将%type转换为varchar2或数字等
提前感谢。同义词是为对象而不是模式创建的 您可以为本地数据库中的每个表(对象、视图等)创建同义词,并使用这些同义词声明锚定类型
CREATE SYNONYM schema2.table1
FOR schema1.table1@db_link
CREATE SYNONYM schema2.table2
FOR schema1.table2@db_link
CREATE SYNONYM schema2.table3
FOR schema1.table3@db_link
通过添加
@DBLINK\u NAME
子句,作为子程序参数使用的%TYPE
引用项可以通过数据库链接指向远程对象,例如:
PROCEDURE A_DATA_B( p_ID IN SCHEMA2.TABLE1.ID@DBLINK_NAME%TYPE,
谢谢你的回答。这很有帮助。但我得到了两个答复。我想知道哪一个对性能有好处。像这样使用过程A_DATA_B(图2.1中的p_ID。ID@DBLINK_NAME%类型,或者像你说的那样使用同义词?或者在当前数据库的模式中创建一个表的引用集,作为数据类型的源?@justin_cave:关于在当前数据库的模式中创建一个表的引用集,作为数据类型的源,你的看法是什么?这是一种方法吗dology Advised?@Krish-这是不可取的。与同义词或在锚定类型定义中显式使用数据库链接相比,它没有任何好处。而且它会造成两组对象可能不同步。感谢您的回答,我想知道哪一个对性能有好处。使用类似于此过程的A_数据B(图2.1中的p_ID。ID@DBLINK_NAME%类型,或者像上面的回答那样使用同义词?或者在当前数据库的架构中创建一组引用表,作为数据类型的源?同义词只是对象的一个替代名称,因此使用同义词不会比通过i引用对象提供更好的性能ts完全限定名称。但是,根据您的环境,它可能还有其他好处,如位置透明度。