Oracle:PL / SQL过程涉及两个不同数据库中的两个不同的Schema

时间:2013-10-11 04:03:33

标签: 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, 

                    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;

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

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

先谢谢..

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

PROCEDURE A_DATA_B( p_ID IN SCHEMA2.TABLE1.ID@DBLINK_NAME%TYPE,