2011-01-18 18 views
5

Ho una procedura valida e contiene una dichiarazione insert..select. Ora c'è un caso in cui l'esecuzione di questa procedura produce l'errore "ORA-00904:: identificatore non valido" da questa dichiarazione. Come è anche teoricamente possibile? Non ci sono trigger o SQL dinamico.Come posso ottenere "ORA-00904:: identificatore non valido" da un pacchetto valido?

Inoltre, il testo ORA-00904 in sqlerrm è senza puntatore a qualsiasi identificatore specifico che Oracle considera non valido.

versione Oracle 9.2.0.8

EDIT2:

Abbiamo scoperto che c'era un problema con una funzione che è stato chiamato da dentro che select (sostituì con costanti e tutto ha funzionato). Probabilmente questa è stata la ragione per cui ORA-00904 non ha fornito un identificatore. Tuttavia, la domanda rimane: come può essere che il codice precompilato senza sql dinamico dia questo errore?

+5

Puoi pubblicare alcuni esempi di codice per favore! – Tim

+2

Ci sono delle viste? Da quello che hai detto, suppongo che tu abbia un gestore di eccezioni per tutti gli errori ('when others') che stampa' SQLERRM'; se non lo hai, l'eccezione verrà comunque sollevata e fornirai maggiori informazioni su da dove proviene. –

+5

La funzione che hai identificato e qualsiasi altra cosa chiamata a sua volta, non ha nemmeno SQL dinamico? Qualcosa nella catena ha una clausola 'authid current_user', che potrebbe influenzare il comportamento tra compilazione e runtime (privilegi e risoluzione)? Stai facendo affidamento su privilegi concessi da un ruolo, che non si applicano ai pacchetti? –

risposta

2

Penso che questo tipo di errore potrebbe verificarsi quando si accede a un pacchetto in cui il pacchetto è valido ma il corpo ha bisogno di compilazione e genera l'eccezione.

Un altro motivo potrebbe essere il codice con authual_utente che viene eseguito con i privilegi dell'utente corrente (non come normale con i privilegi dell'utente proprietario). Una tale procedura potrebbe fallire quando viene chiamata con uno e avere successo quando viene eseguita con un altro utente.

0

Poiché hai già trovato la soluzione, questo non era un tuo problema. Ma volevo aggiungere una nota, che ottieni questo errore se la funzione del pacchetto ha un corpo, ma non c'è la firma della funzione nel foglio delle specifiche.

Problemi correlati