0

我有一个这样的场景,我有一个与此类似的现有程序。

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_link。那么我可以利用那个 db_link 来解决这个问题吗?

通过查看一些文章,我知道也可以使用 SYNONYM。那么这是创建同义词的正确方法吗?

CREATE SYNONYM SCHEMA2 FOR SCHEMA2@db_link;

有人可以在这方面帮助我。

注意:我可能无法将 %type 转换为 varchar2 或数字等。

提前致谢..

4

2 回答 2

1

为对象而不是模式创建同义词。

您可以为本地数据库中的每个表(对象、视图等)创建同义词,并使用它来声明您的锚定类型。

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
于 2013-10-11T06:41:12.153 回答
0

%TYPE您用作子程序参数的引用项可以通过添加@DBLINK_NAME子句通过数据库链接指向远程对象,例如:

PROCEDURE A_DATA_B( p_ID IN SCHEMA2.TABLE1.ID@DBLINK_NAME%TYPE,
于 2013-10-11T06:48:25.633 回答