Когда у меня есть оператор sql, такой как select * from table1
, он отлично работает, но как только я помещаю его в функцию, я получаю:
ORA-00942: table or view does not exist
Как это решить?
Когда у меня есть оператор sql, такой как select * from table1
, он отлично работает, но как только я помещаю его в функцию, я получаю:
ORA-00942: table or view does not exist
Как это решить?
Есть пара вещей, на которые вы могли бы посмотреть. Судя по вашему вопросу, похоже, что владелец функции отличается от владельца таблицы.
1) Гранты через роль. Чтобы создавать хранимые процедуры и функции для объектов другого пользователя, вам необходим прямой доступ к объектам (вместо доступа через роль).
2)
По умолчанию хранимые процедуры и методы SQL выполняются с привилегиями их владельца, а не текущего пользователя.
Если вы создали таблицу в Схеме A и функцию в Схеме B, вам следует взглянуть на концепции Oracle Invoker/Definer Rights, чтобы понять, что может быть причиной проблемы.
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809
Существует большая вероятность того, что привилегии на выбор из table1 были предоставлены роли, и эта роль была предоставлена вам. Привилегии, предоставленные роли, недоступны для PL/SQL, написанного пользователем, даже если пользователю была предоставлена роль.
Вы часто видите это для пользователей, которым была предоставлена роль dba для объектов, принадлежащих sys. Пользователь с ролью dba сможет, скажем, SELECT * from V$SESSION
, но не сможет написать функцию, включающую SELECT * FROM V$SESSION
.
Исправление заключается в предоставлении явных разрешений на данный объект пользователю напрямую, например, в приведенном выше случае пользователь SYS должен GRANT SELECT ON V_$SESSION TO MyUser;
Убедитесь, что функция находится в той же схеме БД, что и таблица.
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>;
Очень простое решение — добавить имя базы данных к имени вашей таблицы, например, если имя вашей БД — DBMS
, а таблица — info
, тогда для любого запроса будет DBMS.info
.
Если ваш запрос
select * from STUDENTREC where ROLL_NO=1;
это может показать ошибку, но
select * from DBMS.STUDENTREC where ROLL_NO=1;
это не так, потому что теперь ваша таблица действительно найдена.
SELECT owner FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND object_name = 'STUDENTREC';
- person chepyle; 19.10.2018