Inside Oracle APEX auf Deutsch (von Patrick Wolf)

ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.

Wenn Ihr den Fehler ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc. (ich stell mir jetzt gar nicht vor wie der auf Deutsch übersetzt heißt... :-) ) von einem DML Prozess in Oracle APEX bekommt, dann ist das weil Oracle APEX versucht den betroffenen Datensatz vorher zu locken, bevor es ein Update/Delete durchführt. Dieses Verhalten wurde in Oracle APEX 3.0 eingebaut, aber leider mit dem Side Effekt, dass komplexe Updateable View mit einem Instead of Trigger den obigen Fehler produzieren.

Übrigens, warum gibt es in der Oracle DB kein "LOCKING" Ereignis für einen Instead of Trigger???

Aber zurück zum Thema, was können wir tun?

In Oracle APEX 3.0.1.00.07/08 wurde ein neue Einstellung zum deaktivieren dieses Verhaltens eingebaut. Es ist im Readme des Patches dokumentiert, aber nicht in der Online Hilfe (Bug wurde erstellt). Die Einstellung heißt FSP_DML_LOCK_ROW und ist ein Substitution Value oder ein Application-/Page Item. Wenn Ihr den Wert auf FALSE setzt, dann macht der DML Prozess kein Locking mehr.

Aber ist es eine gute Idee das Locking für die ganze Applikation zu deaktivieren?

Ich denke nicht! Es sollte nur für jene Seiten erfolgen wo es notwendig ist.
  1. Erstelle ein Application Item mit dem Namen FSP_DML_LOCK_ROW
  2. Erstelle eine Application Computation mit den folgenden Einstellungen
    • Sequence: 0
    • Computation Point: After Submit
    • Computation Type: Static Assignment
    • Computation: TRUE
  3. Erstelle eine Computation auf den Seiten wo der Fehler auftritt
    • Sequence: 10
    • Computation Point: After Submit
    • Computation Type: Static Assignment
    • Computation: FALSE
Übrigens, es gibt noch eine andere Einstellung mit dem das Locking Verhalten beeinflusst werden kann. Sie heißt APEX_DML_LOCK_WAIT_TIME. Mehr Details gibt es in der Dokumentation.

Labels: , ,