Oracle
 sql >> Database >  >> RDS >> Oracle

Viene visualizzato un errore quando si chiama qualsiasi funzione nella query SQL in un pacchetto senza dichiarare la funzione nella specifica del pacchetto

Niente a che vedere con la dichiarazione anticipata.

Questo riguarda il fatto che stai utilizzando una query SQL per chiamare la funzione . Sembra che quando si utilizza un'istruzione per invocare una funzione, non si è più all'interno dell'ambito del pacchetto PL/SQL, quindi è possibile chiamare solo funzioni disponibili pubblicamente.

Quanto al perché , posso solo immaginare, quindi non darlo per scontato, ma PL/SQL e SQL hanno motori diversi . Quindi, quando si esegue una query sql, anche all'interno del pacchetto pl/sql, si passa al livello di SQL dove verificherà nuovamente le autorizzazioni in base al motore SQL. Quindi non ha idea che venga eseguito da un pacchetto PL/SQL e dovresti essere autorizzato a chiamare la funzione privata.

Penso che la differenza dei motori possa essere verificata facilmente, prova a usare un varchar2 di 32000, funzionerà all'interno della tua funzione pl/sql. Ora, se chiami la tua funzione pl/sql restituendo un varchar2(32000) , fallirà. Questo è un problema che ho riscontrato, ma non ho alcun database per darti uno snippet.