在 PL/SQL 脚本上使用 DB 链接会引发“找不到表”错误

Posted

技术标签:

【中文标题】在 PL/SQL 脚本上使用 DB 链接会引发“找不到表”错误【英文标题】:Using DB Links on a PL/SQL script throws "Table not found" error 【发布时间】:2011-08-02 17:19:08 【问题描述】:

在尝试使用 PL/SQL 创建报告时,我发现自己遇到了以下问题,我创建了一个 SQL 查询,该查询使用 DB Link 访问远程 DB 上的 2 个表,单独运行查询本身会返回预期结果,但是当我运行相同的查询并将结果放入游标时,我得到一个

PL/SQL: ORA-00942: table or view does not exist

错误。

我不确定这是否与我为每个表使用的别名有关,或者可能是 select 语句试图选择本地表,我不知道,您有什么建议吗?

PL/SQL:

DECLARE
   CURSOR t_bug_details IS (SELECT h.*
  FROM table1@REMOTEDB h,
       table2@REMOTEDB rml
  WHERE h.product_id   IN (123)
  AND h.category       IN ('category')
  AND h.status          < 4
  AND h.status NOT     IN (1,2,3)
  AND h.release_status IN (upper('P'))
  --AND h.programmer     IN (upper('MRFOO'))
  AND h.some_id      = rml.some_id
  and rownum <=400);

REPORT_DAY VARCHAR2(40);
mail_html clob;
mail_bod clob;

BEGIN

FOR v_some_details in t_bug_details
LOOP
REPORT_DAY := TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS');
DBMS_OUTPUT.PUT_LINE(REPORT_DAY || '|' ||
                     v_some_details.reptnom || '|' ||
                     v_some_details.subject || '|' ||
                     v_some_details.field || '|' ||
                     v_some_details.release_status || '|' ||
                     v_some_details.status || '|' ||
                     v_some_details.category || '|' ||
                     v_some_details.sub_field || '|' ||
                     v_some_details.datef1 || '|' ||
                     v_some_details.field_by || '|' ||
                     v_some_details.programmer || '|' ||
                     TRUNC(sysdate - v_some_details.datef1) || '|' ||
                     TRUNC(sysdate - v_some_details.upd_date)|| '|' ||
                     v_some_details.fix_avail_date|| '|' ||
                     v_some_details.bug_type || '|' ||
                     v_some_details.base_reptnom);
END LOOP;

EXCEPTION WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE ('NO RECORDS FOUND');
END;

【问题讨论】:

【参考方案1】:

PL/SQL 可以在与 SQL 不同的权限下运行。我猜您对通过角色授予的这些表具有权限,您的用户可以使用该角色,但默认情况下 PL/SQL 不能。这是定义者权限和调用者权限的区别。请参阅Oracle's documentation 了解更多信息。

【讨论】:

【参考方案2】:

我在使用 10g 时遇到同样的错误。

    当我创建一个私有数据库链接并收到 ora-00942 错误时发生这种情况。

    链接的用户不是表的所有者,但他被授予访问 表格

    所以,我将链接更改为公共链接 - 然后一切正常 很好。

【讨论】:

以上是关于在 PL/SQL 脚本上使用 DB 链接会引发“找不到表”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 DB2 PL/SQL 匿名块中声明局部变量和声明继续处理程序会导致错误?

PL/SQL 迭代所有模式并在所有模式上运行相同的查询

从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]

由于 Oracle DB 从 12c 升级到 19c,对现有 SQL、PL/SQL 脚本和数据模型有何影响?

如何执行目录中的所有 pl/sql 文件(install_db 脚本)

使用 raise_application_error 的 PL SQL 触发器会引发错误。