Ich habe ein interessantes Verhalten bei der Verwendung von benutzerdefinierten Funktionen innerhalb einer SELECT-Anweisung.Wann werden benutzerdefinierte Funktionen in einer Abfrage in Oracle ausgewertet?
Ich habe ein paar gespeicherte Prozeduren, die Daten aus einer einzelnen Tabelle lesen und löschen. Diese gespeicherten Prozeduren werden von mehreren Quellen verwendet.
In meinen Beobachtungen scheint es, dass die benutzerdefinierten Funktionen manchmal willkürlich ausgewertet werden, nicht immer unmittelbar nach oder während der Ausführung der SELECT-Anweisung, dass es in verwendet wird.
Zum Beispiel in einer gespeicherten Prozedur, ich habe eine select-Anweisung wie folgt aussehen könnte:
SELECT Something, MyFunction(Something) FROM Somewhere;
Dies wird durch einen Anruf an eine andere gespeicherte Prozedur gefolgt wird, die Daten aus der Tabelle spült. Die Menge der bereinigten Daten richtet sich nach einer anderen Tabelle, in der die maximale Anzahl der gelesenen Daten gespeichert wird. Dies bedeutet, dass eine Bereinigung keine Daten löschen darf, die noch nicht von einer anderen ausgeführten Instanz der gespeicherten Prozedur gelesen wurden.
In meinem Testcode gibt MyFunction nur die Anzahl der Zeilen in der Tabelle Somewhere zurück. Daher würde ich mir vorstellen, dass es immer gleich der Anzahl der Zeilen sein sollte, die die SELECT-Anweisung zurückgibt. Jedoch in Fällen, in denen ich zwei Instanzen dieses gespeicherte Prozedur ausführen, bekomme ich Ergebnisse etwas wie folgt aus:
erste Abfrage Beispiel:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
zweite Abfrage Beispiel:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
Warum ist es dass die zweite Abfrage alle Zeilen zurückgibt, aber die benutzerdefinierte Funktion, die für dieselbe Tabelle arbeitet, meldet, dass keine Zeilen in der Tabelle mehr vorhanden sind?
Gibt es trotzdem, dass ich sicherstellen kann, dass die zweite Abfrage-Instanz konsistent ist, dass die benutzerdefinierten Funktionen immer noch dieselben Daten sehen, die die übergeordnete gespeicherte Prozedur sieht?
Ich bin mir nicht sicher zu verstehen: zwischen den 2 Anrufe haben y Oder die Tabelle löschen? – Sebas
Sorry wegen der Verwirrung. Zur Klarstellung gibt es eine gespeicherte Prozedur, die (1) die SELECT-Anweisung ausführt und (2) die Löschprozedur nach der SELECT-Anweisung aufruft. – acee
Ich sehe, also gibt die Funktion das richtige Ergebnis zurück, nicht wahr? Die Auswahl nicht, oder anders gesagt keine Zeile sollte zurückgegeben werden. Bestätigt? – Sebas