2011-02-07 47 views
4


我正在使用插入語句,並試圖插入數據到數據庫表中。我正在使用存儲過程。
但我這樣做時出現此錯誤。
面對一個錯誤:表或​​視圖不存在

消息:ORA-00942:表或視圖不 不存在ORA-06512


我中檢查表/存儲過程是存在或不存在和一切就緒。在表名或sp中也沒有錯字。如果我從查詢編輯器運行SP的一部分,它工作正常,但是當我執行整個SP時,它會引發錯誤。


我試圖斯蒂芬提供的步驟,但因爲我有同樣的用戶/所有者登錄當我運行格蘭特命令它給了我一個錯誤說「不能授予/撤銷對自己的」。
此外還有一個補充。我有一個存儲過程SP1,我在其中使用select語句作爲

Select a from table_name where condition; 

當我單獨執行它時,它會返回一些結果。但是當我執行sp時,它會在寫入的同一行發出錯誤。


任何人都可以幫我解決這個問題。我正在使用SQL +。
預先感謝 維傑

+1

很多可能性:連接到錯誤的數據庫?以表格的名義輸錯?你必須給我們更多的東西來繼續。 – 2011-02-07 16:01:39

+0

你能告訴我們你的程序或插入語句嗎? – CristiC 2011-02-07 16:02:15

回答

11

賈斯廷的回答是正確的,但讓我擴大一點。

大家都說那張桌子不存在並沒有閱讀你的整篇文章。既然你可以:

如果我運行從查詢編輯器SP的一部分,它工作正常

顯然表是存在的。 顯然你有一些訪問它。否則,這顯然不起作用。

但是當我執行整個SP時,它會引發錯誤。

這是因爲Oracle區分直接授予的權限和通過角色授予的權限。

說我這樣做:

Create Table TABLE_A 
Create Role READ_ONLY 
Grant Select on TABLE_A to READ_ONLY 
Grant READ_ONLY to VIJAY 

在SQL窗口/提示可以查詢該表沒有問題。所以現在你需要創建一個視圖

Create VIJAY.VIEW_A as SELECT * FROM TABLE_A 

你會得到TABLE_A確實存在的錯誤。因爲視圖是編譯的,就像一個過程,它沒有任何角色運行。由於它運行時沒有READ_ONLY角色,因此對於TABLE_A存在這一事實是不知情的。現在我需要做的是現在,你有一個直接的權限

Grant Select on TABLE_A to VIJAY. 

,你可以編譯使用該表的視圖或程序/包。

1

好,非常簡單的說,你正在試圖進入你連接到數據庫中不存在插入數據的表。您需要檢查這兩件事情(即,您連接了哪些東西,並且是那裏的表格,並且可以訪問您正在使用的用戶環境)。

+0

另外,檢查您用來連接數據庫的用戶/架構是否有足夠的權限來查看此表/視圖。 – Jonathan 2011-02-07 16:10:43

+0

不是「權限不夠看」。這可以通過角色完成。正如賈斯汀所說,設置角色無,然後測試是否可以訪問表。 – 2011-02-08 15:17:49

1

正如Joe Stefanelli所說..這裏顯示的錯誤有很多可能性。

檢查:

  1. 您連接到正確的Oracle實例。
  2. 您有權查詢或在查詢中引用的表上執行處理。
  3. 普通選擇語句和過程是有區別的。 oracle中的過程不尊重分配給用戶的角色;而是需要將權限明確授予用戶。欲瞭解更多信息,請閱讀下面的鏈接ORA-00942
8

該表是否存在於存儲過程存在的模式中?如果不是,最簡單的解釋是您的程序的所有者已被授予通過角色而不是直接授予的訪問權限。定義者的權限存儲過程需要直接訪問它所訪問的對象。一個快速的方法來測試,這是爲會話禁用角色,即

SQL> set role none; 
SQL> <<execute your query>> 

如果生成錯誤,問題是缺乏直接批地。

相關問題