Скорее всего, проблема в том, что грант был сделан через роль.Привилегии, предоставленные пользователю, недоступны в хранимой процедуре определения прав (по умолчанию).
В SQL Developer относительно легко проверить, что это проблема.Если вы запустите команду
SET ROLE none
, а затем запустите инструкцию SELECT, я ожидаю, что вы получите ту же ошибку ORA-00942.
Если это так, решение будеткак правило, стоит попросить, чтобы владельцы таблиц в схеме YYY предоставили доступ к таблицам непосредственно вам, а не предоставили доступ через роль.За исключением этого, вы можете определить свою хранимую процедуру как хранимую процедуру прав инициатора, добавив AUTHID CURRENT_USER в объявление.Это означало бы, что вызывающая процедура должна иметь доступ к базовым объектам, но это позволит вашим процедурам использовать привилегии, предоставляемые через роль.
Если вы хотите создать хранимую процедуру прав вызывающего,Вам также нужно будет обратиться к имени таблицы с помощью динамического SQL, чтобы отложить проверку привилегий до времени выполнения.Таким образом, вы бы получили что-то вроде
CREATE OR REPLACE PROCEDURE PRC_SOMESP
AUTHID CURRENT_USER
AS
l_cnt pls_integer;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;
, если бы вы хотели хранимую процедуру прав вызывающего, которая запрашивала таблицу TableA в схеме XXX.