ORA-00942: таблица или представление не существует (работает при отдельном sql, но не работает внутри функции оракула)

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

ORA-00942: table or view does not exist 

Как это решить?


person Victor    schedule 12.07.2011    source источник
comment
Может быть, функция принадлежит другой схеме, чем таблица?   -  person Daniel Hilgarth    schedule 12.07.2011
comment


Ответы (5)


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

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

2)

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

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

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

person Rajesh Chamarthi    schedule 12.07.2011

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

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

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

person Steve Broberg    schedule 12.07.2011
comment
Не могли бы вы обновить этот ответ полным примером ПРОЦЕДУРЫ с использованием этой техники? - person user3554664; 11.08.2016
comment
К сожалению, я больше не работаю на работе, связанной с использованием Oracle, поэтому у меня нет машины для проверки правильности написанного мною синтаксиса. Если кто-то еще захочет попробовать, будьте моим гостем. - person Steve Broberg; 11.08.2016

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

person Adriano Carneiro    schedule 12.07.2011
comment
Если функция находится внутри пакета, пакет также должен принадлежать той же схеме, что и таблица? - person Victor; 12.07.2011
comment
Да. В противном случае он не сможет найти таблицу. Если вы не включите имя схемы в выбор: select columns from schema.table1 - person Adriano Carneiro; 12.07.2011

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

Предоставьте все на ABC;

Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;
person Ravindra Junghare    schedule 15.02.2016

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

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

select * from STUDENTREC where ROLL_NO=1;

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

select * from DBMS.STUDENTREC where ROLL_NO=1; 

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

person Ankit Neekhra    schedule 13.02.2018
comment
У меня была та же проблема, если вы не знаете схему, вы можете попробовать вариант № 3 здесь: techonthenet.com/oracle/errors/ora00942.php, для этого примера это будет: SELECT owner FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND object_name = 'STUDENTREC'; - person chepyle; 19.10.2018