程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORA-00942:tableorviewdoesnotexist

ORA-00942:tableorviewdoesnotexist

編輯:Oracle教程

在過程,包,函數,觸發器中調用Oracle相關動態性能視圖時,需要授予適當的權限,否則會收到表和視圖不存在的錯誤提示。即使你可以單獨查詢這些視圖。因為動態性能視圖依賴於底層表,無法直接對其授予權限。下面就是這個現象相關的例子。

1、過程調用動態視圖無法成功編譯的示例

SQL> select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.5.0 - 64bit Production

SQL> show user;
USER is "GX_ADM"

SQL> CREATE OR REPLACE PROCEDURE tst
  2  AS
  3      v_usr   VARCHAR2(30);
  4  BEGIN
  5  SELECT username INTO v_usr FROM v$process WHERE ROWNUM < 2;
  6  DBMS_OUTPUT.put_line ('Username is ' || v_usr);
  7  END;
  8  /

Warning: Procedure created with compilation errors.

SQL> show errors;
Errors for PROCEDURE TST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1      PL/SQL: SQL Statement ignored
5/33     PL/SQL: ORA-00942: table or view does not exist

2、分析與解決

--根據上面提示的錯誤信息,咋一看就是表和視圖不存在
--而實際上動態性能視圖是一個同義詞,並非真正的視圖,下面嘗試使用sys帳戶對其賦予權限到所需用戶
--收到了ORA-02030錯誤信息,也就是說只能對固定的表和視圖進行權限賦予
SQL> conn / as sysdba
Connected.
SQL> grant select on v$process to gx_adm;
grant select on v$process to gx_adm
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views

SQL> conn gx_adm/xxx  -->使用gx_adm用戶連接數據庫
Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.

--用戶本身是可以訪問該動態性能視圖的
SQL> select username FROM v$process WHERE ROWNUM < 2 and username is not null;

USERNAME
---------------
oracle

SQL> conn / as sysdba
Connected.

--Author : Leshami
--Blog   : http://blog.csdn.net/leshami

--基於真實的視圖授予權限
SQL> grant select on v_$process to gx_adm;

Grant succeeded.

--下面再次編譯正常
gx_adm@CNMMBO> alter procedure tst compile;

Procedure altered.

--我們也可以通過執行計劃來查看底層訪問對象為X$KSUPR,這也就是為什麼前面授權失敗的原因
SQL> set autot trace exp;
SQL> select username FROM v$process WHERE ROWNUM < 2 and username is not null;

Execution Plan
----------------------------------------------------------

------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)|
------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |    35 |     0   (0)|
|   1 |  COUNT STOPKEY    |         |       |       |            |
|   2 |   FIXED TABLE FULL| X$KSUPR |     1 |    35 |     0   (0)|
------------------------------------------------------------------

3、Metalink文章(Doc ID 1062335.6)

ORA-00942: table or view does not exist 

Solution Description:

Grant the owner of the stored procedure select directly on the needed V$ view.

SQL> GRANT SELECT on V_$SESSION to <user_name>;

更多參考

有關Oracle RAC請參考

有關Oracle 網絡配置相關基礎以及概念性的問題請參考:

有關基於用戶管理的備份和備份恢復的概念請參考

有關RMAN的備份恢復與管理請參考

有關ORACLE體系結構請參考

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved