【发布时间】:2011-12-11 23:26:51
【问题描述】:
我目前遇到一个问题,即我无法在存储过程中引用链接数据库中的表。我收到错误消息:
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 的不兼容性。
【问题讨论】:
-
如果您的选择权限来自某个角色,则可能会出现同样的症状。您必须直接授予对象才能在 pl/sql 程序中使用它。见dba-oracle.com/concepts/roles_security.htm
标签: sql database oracle stored-procedures dblink