2011-01-18 12 views
5

Mam procedurę, która jest poprawna i ma w nim instrukcja insert..select. Teraz jest przypadek, w którym wykonanie tej procedury powoduje błąd "ORA-00904:: invalid identyfikator" z tego oświadczenia. Jak to jest teoretycznie możliwe? Nie ma wyzwalaczy ani dynamicznego SQL.Jak mogę uzyskać "ORA-00904:: invalid identyfikator" z ważnej paczki?

również tekst w sqlerrm ORA-00904 jest bez wskaźnika do konkretnego identyfikatora że Oracle uzna nieprawidłowy.

wersja Oracle 9.2.0.8

Edit2:

Okazuje się, że był problem z funkcji, która została wywołana z wewnątrz, że select (zastąpił go stałych i wszystko działało). Prawdopodobnie był to powód, dla którego ORA-00904 nie podał identyfikatora. Nadal pozostaje pytanie - jak to możliwe, że prekompilowany kod bez dynamicznego sql daje ten błąd?

+5

Czy możesz podać przykładowy kod, proszę! – Tim

+2

Czy są jakieś widoki? Z tego, co powiedziałeś, domyślam się, że masz obsługę wyjątków dla wszystkich błędów ('gdy inni'), które wypisują' SQLERRM'; jeśli tego nie zrobisz, wyjątek zostanie podniesiony i da więcej informacji o tym, skąd pochodzi. –

+5

Zidentyfikowana funkcja i wszystko, co wywołało, nie ma również dynamicznego SQL? Czy cokolwiek w łańcuchu ma klauzulę 'authid current_user', która może wpływać na zachowanie pomiędzy czasem kompilacji a czasem wykonywania (uprawnienia i rozdzielczość)? Czy polegasz na prywatyzowanych pakietach, które nie mają zastosowania w pakietach? –

Odpowiedz

2

Myślę, że ten rodzaj błędu może się zdarzyć, gdy masz dostęp pakiet gdzie pakiet jest ważny, ale organizm potrzebuje kompilację i zgłasza wyjątek.

Innym powodem może być kod z AUTHID current_user działa z uprawnieniami bieżącego użytkownika (a nie jak zwykle z uprawnieniami użytkownika posiadania). Taka procedura może się nie powieść, gdy zostanie wywołana z jednym i powiodła się, gdy zostanie wykonana z innym użytkownikiem.

0

Ponieważ już znalazłeś rozwiązanie, nie był to twój problem. Ale chciałem dodać notatkę, że pojawia się ten błąd, jeśli funkcja pakietu ma treść, ale nie ma podpisu funkcji w arkuszu Spec.