Molto probabilmente, il problema è che la sovvenzione è stata effettuata tramite un ruolo. I privilegi concessi a un utente non sono disponibili nella stored procedure di un definitore (impostazione predefinita).
In SQL Developer, è relativamente facile verificare che questo sia il problema. Se esegui il comando
SET ROLE none
e quindi eseguire l'istruzione SELECT, mi aspetto che venga visualizzato lo stesso errore ORA-00942.
Supponendo che sia così, la soluzione sarebbe generalmente chiedere ai proprietari delle tabelle nello schema YYY di concedere l'accesso alle tabelle direttamente a te anziché concedere l'accesso tramite un ruolo. Salvo ciò, puoi definire la tua procedura memorizzata come procedura memorizzata dei diritti di un invocatore aggiungendo AUTHID CURRENT_USER alla dichiarazione. Ciò significherebbe che il chiamante della procedura dovrebbe avere accesso agli oggetti sottostanti ma consentirebbe alle tue procedure di utilizzare i privilegi concessi tramite un ruolo.
Se si desidera creare una procedura memorizzata dei diritti dell'invocatore, sarà necessario fare riferimento anche al nome della tabella utilizzando l'SQL dinamico per rinviare il controllo dei privilegi al runtime. Quindi avresti qualcosa come
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;
se volevi una procedura memorizzata dei diritti di un invocatore che interrogasse la tabella TableA nello schema XXX.