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完全限定名称。但是,根据您的环境,它可能还有其他好处,如位置透明度。