Подтвердить что ты не робот

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

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

ORA-00942: table or view does not exist 

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

4b9b3361

Ответ 1

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

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

2)

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Грант All On To ABC;

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