Когда у меня есть оператор 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
Существует большая вероятность того, что привилегии для выбора из таблицы 1 были предоставлены роли, и эта роль была предоставлена вам. Привилегии, предоставленные роли, не доступны PL/SQL, написанным пользователем, даже если пользователю предоставлена роль.
Вы видите это для пользователей, которым была предоставлена роль dba для объектов, принадлежащих sys. Пользователь с ролью dba сможет, скажем, SELECT * from V$SESSION
, но не сможет написать функцию, которая включает SELECT * from V$SESSION
.
Исправление заключается в предоставлении явным разрешениям для данного объекта непосредственно пользователю, например, в приведенном выше случае пользователь SYS должен GRANT SELECT ON V_$SESSION TO MyUser;
Убедитесь, что функция находится в той же схеме БД, что и таблица.
Либо у вас нет разрешения на эту схему/таблицу, либо таблица существует. В основном эта проблема возникает, если вы используете другие таблицы схем в хранимых процедурах. Например. Если вы запускаете Хранимую процедуру с помощью ABC и/или в том же PL/SQL, есть таблицы, которые принадлежат пользователю/схеме XYZ. В этом случае ABC должна иметь GRANT, то есть привилегии таблиц XYZ
Грант All On To ABC;
Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>;