Oracle:在存储过程中使用数据库链接:表或视图不存在

Cla*_*key 11 sql database oracle stored-procedures dblink

我目前有一个问题,我不能在存储过程中引用链接数据库中的表.我收到错误消息:

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)
            )
        )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建数据库链接,作为稍后将创建和执行存储过程的用户:

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在整个工作日内盯着以下错误消息后爆炸自己的头:

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

  3. 尝试使用单引号而不是用户名和密码的双引号.收到此错误:

    ERROR at line 1:
    ORA-00987: missing or invalid username(s)
    
    Run Code Online (Sandbox Code Playgroud)
  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> 
    
    Run Code Online (Sandbox Code Playgroud)

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

Cla*_*key 6

好的,所以我能够让这个工作,各种各样.

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

如果它们存在,则链接创建如下:

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

当双引号不存在时:

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

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

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

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

GC.