【问题标题】:Oracle: PL/SQL Procedure involving two different Schema in two different DatabasesOracle:PL/SQL 过程涉及两个不同数据库中的两个不同模式
【发布时间】:2013-10-11 04:03:32
【问题描述】:

我有一个这样的场景,我有一个看起来类似于这个的现有程序。

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 或数字等。

提前致谢..

【问题讨论】:

    标签: oracle stored-procedures plsql database-schema


    【解决方案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
    

    【讨论】:

    • 感谢您的回答。这很有帮助。但是我收到了两个回复。我想知道哪个对性能有好处。像这样使用 PROCEDURE A_DATA_B( p_ID IN SCHEMA2.TABLE1.ID@DBLINK_NAME%TYPE,还是按照您所说的使用 SYNONYM?或者在当前数据库的模式中创建一组表的引用,作为数据类型的来源?
    • @justin_cave :您对在当前数据库的模式中创建参考表集作为数据类型的来源有何看法?这种方法是否可取?
    • @Krish - 这是不可取的。它对同义词或在锚定类型定义中显式使用数据库链接没有任何好处。并且它会造成两组对象不同步的可能性。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答,我想知道哪个对性能有好处。像这样使用 PROCEDURE A_DATA_B( p_ID IN SCHEMA2.TABLE1.ID@DBLINK_NAME%TYPE, 或者在上面的答案中使用 SYNONYM?或者在当前数据库的模式中创建一个参考表集,作为数据类型的来源?
    • 同义词只是对象的替代名称,因此使用同义词不会提供比通过完全限定名称引用对象更好的性能。但是,根据您的环境,它可能还有其他好处,例如位置透明性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2018-04-27
    • 1970-01-01
    相关资源
    最近更新 更多