ORA-00942: таблица или представление не существует (работает, когда отдельный SQL, но не работает внутри функции оракула) - PullRequest
23 голосов
/ 12 июля 2011

Когда у меня есть SQL-оператор типа select * from table1, он прекрасно работает, но как только я помещаю его в функцию, я получаю:

ORA-00942: table or view does not exist 

Как решить эту проблему?

Ответы [ 5 ]

34 голосов
/ 12 июля 2011

Существует большая вероятность того, что привилегии для выбора из таблицы1 были предоставлены роли, и роль была предоставлена ​​вам. Привилегии, предоставленные роли, недоступны для PL / SQL, написанного пользователем, даже если пользователю была предоставлена ​​роль.

Вы часто видите это для пользователей, которым предоставлена ​​роль dba для объектов, принадлежащих sys. Пользователь с ролью dba сможет, скажем, SELECT * from V$SESSION, но не сможет написать функцию, которая включает SELECT * FROM V$SESSION.

Исправление заключается в предоставлении явных разрешений на рассматриваемый объект непосредственно пользователю, например, в случае выше, пользователь SYS должен GRANT SELECT ON V_$SESSION TO MyUser;

16 голосов
/ 12 июля 2011

Есть пара вещей, на которые вы могли бы взглянуть.Исходя из вашего вопроса, похоже, что владелец функции отличается от владельца таблицы.

1) Предоставление через роль: для создания хранимых процедур и функций на объектах другого пользователя вам необходим прямой доступ кобъекты (вместо доступа через роль).

2)

По умолчанию хранимые процедуры и методы SQL выполняются с привилегиями их владельца, а не их текущего пользователя.

Если вы создали таблицу в схеме A и функцию в схеме B, вам следует взглянуть на концепции Oracle Invoker / Definer Rights, чтобы понять, что может быть причиной проблемы.

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

3 голосов
/ 12 июля 2011

Убедитесь, что функция находится в той же схеме БД, что и таблица.

1 голос
/ 13 февраля 2018

Очень простое решение - добавить имя базы данных с именем таблицы, например, если имя вашей БД - DBMS, а таблица - info, тогда для любого запроса это будет DBMS.info.

ЕслиВаш запрос

select * from STUDENTREC where ROLL_NO=1;

может показывать ошибку, но

select * from DBMS.STUDENTREC where ROLL_NO=1; 

это не так, потому что теперь фактически ваша таблица найдена.

1 голос
/ 16 февраля 2016

Либо у вас нет прав доступа к этой схеме / таблице ИЛИ таблица существует.В основном эта проблема возникала, если вы используете другие таблицы схем в своих хранимых процедурах.Например.Если вы запускаете хранимую процедуру от пользователя / схемы ABC и в том же PL / SQL есть таблицы из пользовательской / схемы XYZ.В этом случае ABC должен иметь GRANT, то есть привилегии таблиц XYZ

Grant All On ABC;

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