2011-07-12 15 views
19

當我有一個像select * from table1這樣的sql語句,它的工作很好,但只要我把它放進功能,我得到:ORA-00942:表或視圖不存在(工作時單獨的SQL,但不能在oracle函數內工作)

ORA-00942: table or view does not exist 

如何解決這個問題?

+0

也許該函數屬於與表不同的模式? –

+0

強烈關聯:[oracle「table or view does not exist」from stored procedure](http://stackoverflow.com/q/4198052/1377865) –

回答

14

有幾件事你可以看看。根據你的問題,它看起來像功能所有者不同於表所有者。

1)通過角色授予:爲了在其他用戶的對象上創建存儲過程和函數,需要直接訪問對象(而不是通過角色進行訪問)。

2)

默認情況下,存儲過程和SQL方法執行與它們的主人,而不是他們當前用戶的權限 。

如果您在架構A中創建了一個表並且在架構B中創建了這個功能,那麼您應該看看Oracle的調用者/定義者權限概念,以瞭解可能導致問題的原因。

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809

3

確保該函數與表格具有相同的數據庫架構。

+0

如果函數在一個包內,那麼該包也需要屬於與表格相同的模式? – Victor

+0

是的,它的確如此。否則,它將無法找到表格。除非在選擇中包含模式名稱:'從schema.table1選擇列' –

31

有一個很大的機會的特權,從表1中選擇已授予一個角色,而角色已被授予給你。即使用戶已被授予角色,授予角色的權限也不可用於用戶編寫的PL/SQL。

對於已被sys擁有的對象授予dba角色的用戶,您會看到很多。具有dba角色的用戶將能夠,例如SELECT * from V$SESSION,但無法編寫包含SELECT * FROM V$SESSION的函數。

修復的方法是有問題給用戶的對象上直接授予明確權限,例如在上述情況下,所述SYS用戶必須GRANT SELECT ON V_$SESSION TO MyUser;

+0

您是否可以使用該技術使用完整的PROCEDURE示例更新此答案? – user3554664

+0

不幸的是,我不是在使用Oracle的工作,所以我沒有一臺機器來測試我寫的任何語法的有效性。不過,如果有人想刺穿它,請成爲我的客人。 –

1

要麼ü也無權進行該模式/表OR表確實存在。 如果您在存儲過程中使用其他架構表,通常會發生此問題。例如,如果從用戶/模式ABC運行存儲過程,並且在相同的PL/SQL中有來自用戶/模式XYZ的表。在這種情況下,ABC應該具有GRANT,即XYZ表格的特權

將所有內容授予ABC;

Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>; 
0

一個非常簡單的解決方案是用你的表名加上數據庫名稱一樣,如果你的數據庫的名字是DBMS和表info那麼這將是DBMS.info任何查詢。

如果您的查詢是

select * from STUDENTREC where ROLL_NO=1; 

它可能顯示它並沒有因爲現在實際上你的表中找到錯誤,但

select * from DBMS.STUDENTREC where ROLL_NO=1; 

相關問題