Ansicht
Dokumentation

ABENIUM_LOB - IUM LOB

ABENIUM_LOB - IUM LOB

General Material Data   General Material Data  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

INSERT, UPDATE, MODIFY dbtab, LOB-Handles

In den Anweisungen INSERT, UPDATE oder MODIFY können LOB-Handles als Schreibströme erzeugt und als Lokatoren angegeben werden.

Voraussetzungen

Ein LOB in einer einzufügenden oder zu ändernden Zeile kann aus einer LOB-Handle-Komponente eines Arbeitsbereichs oder einer einzelnen Referenzvariable für ein LOB-Handle (bei UPDATE mit SET) versorgt werden. Der statische Typ jeder LOB-Handle-Komponente muss eine der folgenden Systemklassen für Streaming oder Lokatoren sein:

Der Stromtyp bzw. Lokatortyp muss also zum Datentyp des LOBs passen.

Regeln

Anders als bei lesenden Zugriffen ist das Verhalten für Ströme und Lokatoren unterschiedlich.

Ändernde Zugriffe über Schreibströme

Wenn bei einem ändernden Zugriff ein LOB mit einer Referenzvariable vom Typ CL_ABAP_DB_C_WRITER oder CL_ABAP_DB_X_WRITER verknüpft ist, wird in der Regel ein entsprechender Schreibstrom erzeugt und die Referenzvariable zeigt nach Ausführung der Anweisung auf das Objekt. Der zu ändernde LOB kann mit den Methoden des Schreibstroms bearbeitet werden. Bei der Verknüpfung eines LOBs mit einem Schreibstrom, der von einer LOB-Handle-Komponente des Quell-Arbeitsbereichs referenziert wird, kann es dabei zu folgendem plattformabhängig unterschiedlichen Verhalten kommen:

  • Auf manchen Datenbanksystemen (MaxDB, Oracle) werden die Komponenten des Arbeitsbereichs, die keine LOB-Handle-Komponenten sind, direkt bei Ausführung der Anweisung in die Datenbanktabelle geschrieben. Falls die Zeile nicht eingefügt oder geändert werden kann, werden sy-subrc und sy-dbcnt sofort entsprechend gesetzt und keine Schreibströme für die LOB-Handle-Komponenten erzeugt. Falls die Zeile eingefügt oder geändert werden kann, werden Schreibströme erzeugt und deren Inhalt spätestens beim Schließen des letzten Schreibstroms der-Anweisung an die Datenbanktabelle übertragen.
  • Auf anderen Datenbanksystemen werden die Komponenten des Arbeitsbereichs, die keine LOB-Handle-Komponenten sind, nicht direkt bei Ausführung der Anweisung in die Datenbanktabelle geschrieben. Statt dessen werden immer Schreibströme für die LOB-Handle-Komponenten erzeugt. Die Inhalte der übrigen Komponenten werden ebenfalls verzögert, d.h., spätestens beim Schließen des letzten Schreibstroms der-Anweisung übermittelt. Zwischen Ausführung der Anweisung und dem tatsächliche Schreiben der übrigen Komponenten ist der Zustand undefiniert, da noch nicht feststeht, ob die Operation überhaupt ausgeführt werden kann. In diesem Fall ist nach Ausführung der Anweisung sy-subrc auf den Wert 2 und sy-dbcnt auf den Wert -1 gesetzt. Vor dem Schließen eines Schreibstroms kann man sich mit dessen Methode GET_STATEMENT_HANDLE aus dem Interface IF_ABAP_DB_WRITER eine Referenz auf ein Objekt der Klasse CL_ABAP_SQL_CHANGING_STMNT, einer Unterklasse von CL_ABAP_SQL_STATEMENT_HANDLE, besorgen. Die Methode GET_STATE informiert über den Zustand der -Anweisung und die Methode GET_DB_COUNT gibt die Anzahl der eingefügten bzw. geänderten Zeilen zurück, nachdem der letzte Schreibstrom der -Anweisung geschlossen wurde. Mit den Methoden der abstrakten Oberklasse kann der Zustand der -Anweisung abgefragt und es können alle noch offenen Ströme geschlossen werden. Solange die -Anweisung nicht durch Schließen des letzten Schreibstroms geschlossen wurde, gibt auch GET_DB_COUNT den Wert -1 zurück. Wenn die Operation nicht ausgeführt werden kann, z.B. wegen doppelter Schlüsseleinträge, kommt es bei der Übertragung an die Datenbank zu einer der Ausnahmen CX_STREAM_IO_EXCEPTION oder CX_CLOSE_RESOURCE_ERROR, je nachdem wann die Datenübertragung stattfindet.

Ein solcherart erzeugter Schreibstrom lebt bis er explizit mit seiner Methode CLOSE aus dem Interface IF_ABAP_CLOSE_RESOURCE geschlossen wird. Solange es noch einen offenen Schreibstrom zu einer -Anweisung gibt, ist die zugehörige Datenbankoperation nicht abgeschlossen. Der Zustand der -Anweisung wird durch ein Objekt der Klasse CL_ABAP_SQL_STATEMENT_HANDLE beschrieben, für das die Methode GET_STATEMENT_HANDLE jedes Schreibstroms eine Referenz zurück gibt.

Beim Umgang mit Schreibströmen kommt es in folgenden Fällen zu einer unbehandelbaren Ausnahme:

  • Beim Zugriff auf einen bereits geschlossenen Schreibstrom.

Hinweise

  • Wann genau die Daten eines Schreibstroms an die Datenbank übertragen werden, ist nicht festgelegt. Die Übertragung geschieht spätestens beim Schließen des letzten Schreibstroms, kann aber auch schon während des Schreibens in den Strom auftreten, z.B. weil ein Puffer nicht mehr ausreicht.
  • Ein Schreibstrom sollte immer so schnell wie möglich explizit mit seiner Methode CLOSE geschlossen werden. Siehe Streaming und Lokatoren.

Ändernde Zugriffe über Lokatoren

Wenn bei einem ändernden Zugriff ein LOB mit einer Referenzvariable vom Typ CL_ABAP_DB_C_LOCATOR oder CL_ABAP_DB_X_LOCATOR verknüpft ist, muss diese auf einen entsprechenden Lokator zeigen, der in einer Anweisung SELECT für einen LOB einer anderen oder der gleichen DDIC-Datenbanktabelle erzeugt wurde. Wenn die Anweisung ausgeführt werden kann (sy-subrc ist 0), wird der zu ändernde LOB direkt im Datenbanksystem durch den vollständigen LOB des Lokators ersetzt.

Einschränkungen

Es gelten folgende Einschränkungen:

  • Zu einer Open-SQL-Anweisung können maximal 16 Datenströme geöffnet werden.
  • In einer Datenbank-LUW kann es maximal 16 Open-SQL-Anweisungen geben, deren Datenströme gleichzeitig geöffnet sind.
  • Innerhalb einer Datenbank-LUW können maximal 1000 LOB-Handles geöffnet sein.

Hinweis

Ein LOB-Handle sollte immer so schnell wie möglich mit seiner Methode CLOSE geschlossen werden. Siehe Streaming und Lokatoren.

Beispiele

Beispiel

Die Komponenten string1 und string2 der Struktur wa werden als LOB-Handles für zeichenartige Schreibströme deklariert. Die Anweisung MODIFY erzeugt die Schreibströme. Über die Referenzvariable stmnt werden sequenziell Zeichenketten an beide Schreibströme übergeben. Nach dem Schließen der Schreibströme enthalten die zugehörigen Datenbankfelder STRING1 und STRING2 deren verketteten Inhalt.

Beispiel

In der Anweisung UPDATE wird die Spalte STRING2 mit einem Lokator modifiziert, der in einer SELECT-Anweisung für die Spalte STRING1 der gleichen DDIC-Datenbanktabelle erzeugt wurde. Danach haben STRING1 und STRING2 den gleichen Inhalt.






Addresses (Business Address Services)   TXBHW - Original Tax Base Amount in Local Currency  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 11315 Date: 20240523 Time: 183213     sap01-206 ( 191 ms )