Frage

Die Dokumente für Pipelined -Funktionen sagen, dass DML nicht zulässig ist, wenn sie in einer SQL -Anweisung verwendet werden (normalerweise a SELECT) und in den meisten Beispielen werden die Pipelined -Funktionen für die Datenerzeugung oder -transformation verwendet (Annahme eines Custor als Parameter), jedoch keine DML -Anweisungen ausgeben.

Technisch gesehen ist es jetzt möglich, Auswahl ohne Fehler von Oracle zu verwenden (Oracle (Ora 14551 wird nicht passieren). Ich habe jedoch Erfahrungen reproduzierbares seltsames Verhalten der Auswahl; wenngleich PRAGMA AUTONOMOUS_TRANSACTION ist nicht Die Verwendung, die von den abgerufenen Zeilen SELECT erscheinen nicht Immer die aktuelle lokale Transaktion berücksichtigen, was für mich wie ein Fehler anfühlt. Noch beunruhigender ist die Tatsache, dass bei Verwendung einer verteilten Transaktion (zum Beispiel über Oramts anstelle einer lokalen Transaktion) die Transaktion verwendet wird.

Bearbeiten: Wie sich herausstellt, scheint der seltsame Effekt mit einigen mit Aussagen in der Abfrage zusammen zu stehen, die manchmal und manchmal nicht funktionieren (abhängig von der aktuellen Stimmung des Oracle -Optimierers, zumindest in 10 g). In einigen Fällen erhalte ich eine ORA-32036, dann tritt es wieder nicht auf, ohne den Code überhaupt zu ändern. Jetzt sieht es so aus, als ob die Abfragen, die manchmal mit dem ORA-32036 fehlschlagen, diejenigen sind, die auch nicht die richtige Transaktion verwenden, und sie kann nicht mit der pipelierten Funktion zusammenhängen.

Meine spezifischen Fragen sind also:

  • Gibt es eine, vorzugsweise offizielle Erklärung, ob SELECTs in pipelierten Tabellenfunktionen sind erlaubt und wie hoch ihr Transaktionskontext ist?

  • Gibt es eine andere Möglichkeit, häufig verwendete Abfragen zu modularisieren, die in SQL -Anweisungen verwendet werden können (so wie Tabellenfunktionen mit können TABLE())?

  • Hat jemand auch ein solches Verhalten erlebt und weiß vielleicht mehr darüber? Ich habe mit Metalink gesucht, aber leider habe ich nichts Bestimmtes zu diesem Thema gefunden.

War es hilfreich?

Lösung

  1. Normalerweise betreffen die DML -Beschränkungen nur Änderungen (Aktualisieren, Löschen ...) Anweisungen, sodass ausgewählt werden sollte. Ich werde versuchen, eine bestimmte Aussage von Oracle zu finden.

  2. Ansichten wären Ihr erstes Werkzeug, um häufig verwendete Abfragen zu modularisieren.

  3. Funktionen haben einen Nachteil gegenüber Ansichten: Wenn sie von einem anderen ausgewählt werden, werden sie nicht zur gleichen Punkt-in-Zeit wie die Hauptauswahl ausgeführt. Jeder Aufruf zu einem Auswahl ist konsistent, aber da sich die Auswahl im Funktionscode befinden und nicht im Haupt -SQL -SQL inkonsistente Ergebnisse zurückgeben. Dies ist mit Ansichten und Unterwählungen nicht möglich: Wenn eine große Aussage eine Ansicht aufgerufen wird, wird die Ansicht in derselben Punkt-in-Zeit wie die Hauptabfrage erstellt.

Aktualisieren: In Bezug auf Ihren Kommentar zu parametrisierten Abfragen

Sie können parametrisierte Ansichten erstellen, dh Ansichten, die von vor der Ausführung festgelegten Variablen abhängen. Hier ist ein Beispiel zu Asktom zeigen, wie Sie es machen könnten userenv('client_info') oder dbms_session.set_context.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top