PL / SQL: ORA-00942: таблица или представление не существует.Внутренняя функция - PullRequest
0 голосов
/ 23 октября 2018

Я могу просмотреть результат, когда пишу запрос вне блока, но запись его внутри функции показывает ошибку.

SELECT max(logid) FROM hawk.log_patch_execution_result;

Вывод:

461

Функция:

CREATE OR REPLACE FUNCTION latest_log_id RETURN NUMBER IS
v_log_id NUMBER; 
v_sql VARCHAR2(4000);
BEGIN
  SELECT max(logid) INTO v_log_id FROM hawk.log_patch_execution_result;
  RETURN v_log_id;
END latest_log_id;
/

Вывод:

Create function, executed in 16 ms
PL/SQL: ORA-00942: table or view does not exist
PL/SQL: SQL Statement ignored
Total execution time 16 ms

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Таблица, которую вы выбираете, принадлежит пользователю hawk.

Пользователю, который использует функцию, должна быть предоставлена ​​привилегия SELECT (для этой таблицы).Я предполагаю, что вы сделали это (так как SELECT само по себе работает нормально, но не как часть функции) - через какую-то роль.Однако это не сработает - вы должны предоставить привилегию напрямую пользователю, а не через роль.

0 голосов
/ 23 октября 2018

Кажется, проблема в схеме / пользователе, с которым вы работаете.Попробуйте скомпилировать его таким образом, добавив имя схемы в функцию.

CREATE OR REPLACE FUNCTION hawk.latest_log_id RETURN NUMBER IS
v_log_id NUMBER; 
v_sql VARCHAR2(4000);
BEGIN
  SELECT max(logid) INTO v_log_id FROM hawk.log_patch_execution_result;
  RETURN v_log_id;
END latest_log_id;
/
...