我有这样的场景,我有一个类似于此的现有程序。
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或数字等。
先谢谢..
答案 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,