【问题标题】:Oracle: Using a database link in a stored procedure : table or view does not existOracle:在存储过程中使用数据库链接:表或视图不存在
【发布时间】:2011-12-11 23:26:51
【问题描述】:

我目前遇到一个问题,即我无法在存储过程中引用链接数据库中的表。我收到错误消息:

ORA-00942: 表或视图不存在

以下是我在主机(运行 oracle 10g)上设置数据库链接到远程数据库(运行 oracle 11g)的步骤。步骤是准确的,但有些名称已更改,但保持一致。

  1. 更新 tnsnames.ora,添加一个新条目:

    REMOTE_DB =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)
                       (HOST = 10.10.10.10)
                       (QUEUESIZE = 20)
                       (PORT = 1521)
            )
            (CONNECT_DATA =
                       (SERVICE_NAME = remote_service)
            )
        )
    
  2. 创建数据库链接,作为稍后创建和执行存储过程的用户:

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
  3. 通过从中选择来证明数据库链接正在工作:

    select id from remote_table@remote_link;
    
    id
    --------------------------------------------------------------------------------
    8ac6eb9b-fcc1-4574-8604-c9fd4412b917
    c9e7ee51-2314-4002-a684-7817b181267b
    cc395a81-56dd-4d68-9bba-fa926dad4fc7
    d6b450e0-3f36-411a-ba14-2acc18b9c008
    
  4. 创建依赖于工作数据库链接的存储过程:

    create or replace
    PROCEDURE test_remote_db_link
    AS
    v_id varchar(50);
    BEGIN   
        select id into v_id from remote_table@remote_link where id = 'c9e7ee51-2314-4002-a684-7817b181267b';
        dbms_output.put_line('v_id : ' || v_id);
    END test_remote_db_link;
    
  5. 盯着下面的错误信息看了一整天后自己炸了:

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist
    

我尝试了很多方法来解决这个问题,包括:

  1. 创建数据库链接时,不要在用户名和密码周围使用引号。链接创建得很好,但从中选择会给我这个错误:

    ERROR at line 1:
    ORA-01017: invalid username/password; logon denied
    ORA-02063: preceding line from TWS_LINK
    
  2. 尝试了大写/小写用户名和密码的各种组合。收到与 1 相同的错误。

  3. 尝试使用单引号代替用户名和密码周围的双引号。收到此错误:

    ERROR at line 1:
    ORA-00987: missing or invalid username(s)
    
  4. 通过使用 sqlplus 连接到远程数据库,证明我可以完全访问它:

    [oracle]$ sqlplus remote_user/remote_pass@REMOTE_DB
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 20 22:23:12 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> 
    

我不确定下一步该做什么。下一步可能是开始查看远程数据库上的问题,也许看看其他数据库是否可以连接到它。另一种方法是查看从主机 10g 到远程 11g 的不兼容性。

【问题讨论】:

标签: sql database oracle stored-procedures dblink


【解决方案1】:

我在 11gR2 上遇到了同样的问题,感谢这个论坛帮助我找到了问题。使 db 链接在 SQL 和过程中都起作用的方法是遵循以下语法(仅将密码括在双引号中)。

create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';

【讨论】:

    【解决方案2】:

    好的,所以我能够得到这个工作,有点。

    事实证明,在创建数据库链接时,用户名和密码字段周围的双引号引起了问题。总结一下:

    如果它们存在,并且链接是这样创建的:

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
    1. 远程数据库可以通过sql查询
    2. 存储过程无法编译,收到 ORA-942 错误
    3. 由于程序无法编译,因此无法执行

    当双引号不存在时:

    create database link remote_link
    connect to remote_user
    identified by remote_pass
    using 'REMOTE_DB';
    
    1. 远程数据库无法通过sql查询,收到无效密码错误(问题详述)
    2. 存储过程可以无错误地编译。
    3. 存储过程按预期执行,从数据库链接中检索数据并显示它。

    因此,即使无法通过sql查询远程数据库,收到无效密码错误,使用相同连接信息的过程也可以正常编译和执行。

    我相信你会同意,这是一个奇怪的事件状态,我真的偶然发现让它在我的场景中工作。我不太确定我是否会称其为解决方案,因为有很多未解决的问题。

    希望如果有人通过谷歌来到这里,他们会发现这个答案很有用,并且至少让他们的代码运行起来。

    GC。

    【讨论】:

    【解决方案3】:

    我想我在这里看到了一个问题。执行存储过程的用户是否与创建存储过程的用户相同?

    您说,“创建数据库链接,作为稍后将执行存储过程的用户”。

    如果创建数据库链接的用户与创建存储过程的用户不同,那可能是你的问题。

    尝试以同一用户身份创建存储过程和数据库链接,或创建公共数据库链接。

    然后,由于 Oracle 默认是定义者权限,您可以让任何人执行存储过程(假设他们已被授予该过程的执行权限)。

    【讨论】:

    • 您好,感谢您的回复。我已经用同一个用户完成了所有事情,即创建了数据库链接并尝试用同一个用户创建过程。公共数据库链接是个好主意。我下次试试。
    • 您是否在编译时或运行时收到 ORA-942 错误? (我猜是编译时间?)
    • 是的,我在编译时得到 ORA-942。我尝试使用公共数据库链接,但我得到了同样的错误。与普通数据库链接没有区别:s
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 2010-09-19
    • 2017-02-08
    • 2013-01-31
    • 2011-07-28
    • 2020-09-24
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多