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

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
0
Success Shrestha 23 Окт 2018 в 10:29

2 ответа

Лучший ответ

Выбранная вами таблица принадлежит пользователю hawk.

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

3
Success Shrestha 26 Окт 2018 в 07:59

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

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;
/
1
Success Shrestha 26 Окт 2018 в 06:43
52943429