我目前遇到一个问题,即无法在存储过程中引用链接数据库中的表。我收到错误消息:
ORA-00942:表或视图不存在
以下是我在主机(运行oracle 10g)上设置数据库链接到远程数据库(运行oracle 11g)的步骤。这些步骤是准确的,但有些名称已被更改,但它们保持一致。
更新tnsnames.ora,添加一个新条目:
REMOTE_DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)
(HOST = 10.10.10.10)
(QUEUESIZE = 20)
(PORT = 1521)
)
(CONNECT_DATA =
(SERVICE_NAME = remote_service)
)
)
创建数据库链接,作为稍后将创建和执行存储过程的用户:
create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
通过从中选择证明数据库链接正在运行:
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
创建依赖于工作数据库链接的存储过程:
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;
在整整一个工作日内盯着以下错误消息后爆炸了自己的头:
Error(10,27): PL/SQL: ORA-00942: table or view does not exist
我尝试过很多方法来解决这个问题,包括:
创建数据库链接时,不要使用用户名和密码周围的引号。链接创建很好,但从中选择会给我这个错误:
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from TWS_LINK
尝试使用大写/小写的各种用户名和密码组合。收到与1相同的错误。
尝试使用单引号而不是用户名和密码的双引号。收到这个错误:
ERROR at line 1:
ORA-00987: missing or invalid username(s)
通过使用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的不兼容性。
答案 0 :(得分:6)
好的,所以我能够做到这一点。
事实证明,在创建数据库链接时,用户名和密码字段周围的双引号导致了问题。总结一下:
如果它们存在,并且链接如此创建:
create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
当双引号不存在时:
create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
因此,即使无法通过sql查询远程数据库,收到无效的密码错误,使用此相同连接信息的过程也会编译并正常执行。
我相信你会同意,这是一个奇怪的事件状态,我真的偶然发现它在我的场景中有效。我不太确定我会把它称为解决方案,因为有很多未解决的问题。
希望如果有人通过谷歌来到这里,他们会发现这个答案很有用,至少可以让他们的代码运行。
GC
答案 1 :(得分:4)
我在11gR2上面临同样的问题,我很感谢这个论坛帮助我找到问题所在。使db链接在SQL和过程中工作的方法是遵循以下语法(仅在双引号内包含密码)。
create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';
答案 2 :(得分:2)
我想我在这里看到了一个问题。正在执行存储过程的用户是否是创建存储过程的同一用户?
你说,“创建数据库链接,作为稍后执行存储过程的用户”。
如果创建数据库链接的用户与创建存储过程的用户不同,那可能是您的问题。
尝试以同一用户身份创建存储过程和数据库链接,或创建公共数据库链接。
然后,由于Oracle默认是定义权限,因此您可以让任何人执行存储过程(假设它们已被授予对该过程的执行权限)。