Oracle “ORA-00942:表或视图不存在”仅在存储过程中运行时存在

Oracle “ORA-00942:表或视图不存在”仅在存储过程中运行时存在,oracle,stored-procedures,plsql,ora-00942,Oracle,Stored Procedures,Plsql,Ora 00942,对于PL-SQL人员来说,这应该很容易选择。在将此问题标记为重复问题之前,请确保尽管错误消息可能很常见,但基本问题与上一个问题相同。如果是,请提供已解决的确切逻辑重复问题的链接。我 当我登录到模式时,我执行以下PL-SQL代码: DECLARE v_rpt_per_key NUMBER := 0; BEGIN SELECT MAX(rpt_per_key) INTO v_rpt_per_key FROM rxfinods_sta.hd_invc_ln_item_dtl_stat

对于PL-SQL人员来说,这应该很容易选择。在将此问题标记为重复问题之前,请确保尽管错误消息可能很常见,但基本问题与上一个问题相同。如果是,请提供已解决的确切逻辑重复问题的链接。我

当我登录到模式时,我执行以下PL-SQL代码:

DECLARE
  v_rpt_per_key NUMBER := 0;
BEGIN

  SELECT MAX(rpt_per_key)
  INTO v_rpt_per_key
  FROM rxfinods_sta.hd_invc_ln_item_dtl_stat;

  dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);

END;
/
查询成功执行,RPT_PER_KEY的最大值写入Toad中的输出窗口。 但是,当我在过程中执行基本相同的代码时

CREATE OR REPLACE PROCEDURE hd_purge_test
IS
  v_rpt_per_key NUMBER := 0;
  BEGIN

    SELECT MAX(stat.rpt_per_key)
    INTO v_rpt_per_key
    FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
    --HD_INVC_LN_ITEM_DTL_STAT        

    dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);

    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      NULL;
    WHEN OTHERS THEN
    -- Consider logging the error and then re-raise
      RAISE;
  END hd_purge_test;
我得到一个错误,该表不存在

[Warning] ORA-24344: success with compilation error
14/21   PL/SQL: ORA-00942: table or view does not exist
9/4     PL/SQL: SQL Statement ignored
 (1: 0): Warning: compiled but with compilation errors
由于我能够在使用相同凭据时查询表,这证明我的ID有权从表中进行选择。我不应该也有权从我在同一登录模式下创建的存储过程中查询表吗?是否需要执行一些额外的拨款


注意:如果我从登录模式中的任何表中进行选择,则该过程将成功编译。

听起来像是通过角色而不是直接向模式授予选择权限的问题。请参阅。

检查您的用户是否具有访问该表的直接授权,而不是“授予选择xxx_角色”的权限。

您是否可以执行以下操作,然后再次编译您的过程:

--GRANT ALL ON <YOUR TABLE NAME> TO <YOUR USER NAME>;

GRANT ALL ON RXFINODS_STA.HD_INVC_LN_ITEM_DTL_STAT TO chadD;
这将授予对象的完全权限。

或者您可以执行以下操作:

CREATE OR REPLACE PROCEDURE hd_purge_test
AUTHID当前用户

IS
  v_rpt_per_key NUMBER := 0;
  BEGIN

    SELECT MAX(stat.rpt_per_key)
    INTO v_rpt_per_key
    FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
    --HD_INVC_LN_ITEM_DTL_STAT        

    dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);

    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      NULL;
    WHEN OTHERS THEN
    -- Consider logging the error and then re-raise
      RAISE;
  END hd_purge_test;

可能的副本可能的副本谢谢。请澄清。根据引用的答案:默认情况下,存储过程和SQL方法以其所有者而不是当前用户的权限执行。当它说他们的所有者的特权,所有者是什么?存储过程?我是在我的模式下创建的proc的所有者。还有,为什么权利授予我所属的角色与直接授予我的角色有关系?因为这很重要。对于pl/sql,角色授权是不够的,您需要使用AUTHID CURRENT_直接授权用户帮助块理解您正试图通过过程访问同一个表