Behandlung von BLOBs: PUT BLOB, GET BLOB

Diese Funktionalität ist nicht auf allen Plattformen unterstützt.

EXEC TAA GET BLOB <feldname> [ ( <index1> [,<index2> [,<index3> ]] ) ]
    IN [<position>] <objekt> [(<position>)]
    LENGTH [INTO] <Feldangabe1> DATA [INTO] <Feldangabe2>
END-EXEC

EXEC TAA PUT BLOB <feldname> [ ( <index1> [,<index2> [,<index3> ]] ) ] 
    IN <objekt>
    LENGTH [FROM] <Feldangabe1> DATA [FROM] <Feldangabe2>
END-EXEC

<Feldangabe> = {COBOL-Variable | <objektname>.<feldname>[(indices)]}
<objekt> Name des Objekts
<position> Position im Objekt, z.B. FIRST, LAST, (<num.index>). Die Positionsangabe darf nur einmalig entweder vor oder nach dem Objekt erfolgen, nicht zweimal (s. auch z.B. GET).
<feldname> Name des Blob-Feldes
<indexn> Indices für das Feld (max. 3), zur Zeit nur numerische Konstante zulässig
<Feldangabe1> numerische COBOL-Variable, die die Länge des Blobs enthält
<Feldangabe2> COBOL-Variable im Format USAGE IS POINTER, die die Adresse des Blobs enthält. Die Angabe „ADDRESS OF <datenbereich>“ wird nicht unterstützt.

„BLOBS“, oder „Binary Long Objects“ sind beliebig lange Datenbereiche beliebigen Inhalts. Sie können benutzt werden, um Daten ohne Konvertierung zwischen verschiedenen Modulen und ggf. verschiedenen Platformen weiterzureichen. Der Inhalt des Blobs ist mit TAA-Funktionalität nicht referenzierbar. Die Struktur des Blob-Inhalts kann, braucht aber nicht, einem in dem Modul definierten COBOL-Datensatz entsprechen. Wenn in dem Modul kein COBOL-Datensatz in der entsprechenden Struktur definiert ist, kann in dem Modul auf den Inhalt des Blobs i.d.R. nicht zugegriffen werden.

Um die Information über einen Blob in einem TAA-Objekt abzustellen, müssen die Adresse sowie die Länge übergeben werden. Es ist in COBOL jedoch nicht erlaubt, direkt auf die Blob-Felder in der Datenstruktur zuzugreifen. Diese Felder werden deshalb in der Copy-Strecke mit TX- präfixiert. Jeder Zugriff auf einen Blob muss über die obenstehenden Anweisungen erfolgen. Die Infrastruktur füllt die Blob-Felder in dem Objekt mit den Informationen, über die sie auf diese Blobs zugreifen kann; diese Informationen stellen nicht unbedingt Pointer und Länge dar und sind innerhalb des COBOL-Moduls nicht interpretierbar.

Bei Objekten, die viele Blobs enthalten (z.B. in Tabellen), kann das Generat für die PUT, ADD und INSERT-Anweisungen relativ umfangreich werden. Wenn mehrere gleiche Anweisungen notwendig sind, kann es bei solchen Objekten sinnvoll sein, diese einmalig zu erzeugen und über PERFORM auszuführen.

Bitte beachten Sie, dass MOVE oder INITIALISE-Anweisungen, die die gesamte Objektstruktur oder Teile davon betreffen, die Blob-Felder enthalten, die Blob-Informationen zerstören! Soweit es die Infrastruktur erkennt (z.B. Inhalt der Blob-Felder ist null), werden diese Blobs beim nächsten PUT des Objekts auch in der Infrastruktur gelöscht. Ist es für die Infrastruktur nicht erkennbar, führt dies zu unvorhersehbaren Ergebnissen.

Wichtig bei Listenobjekten: Bei Listenobjekten kann ein Blob erst in einem Satz abgestellt werden , nachdem der Satz mit ADD oder INSERT in der Infrastruktur angelegt wurde! Der Versuch, einen Blob in einem noch nicht existierenden Satz zu speichern, führt zum Fehler.

Ein GET BLOB ist auch auf einen Blob in einem anderen als dem aktuellen Listensatz (CURRENT) möglich. Ein PUT BLOB jedoch kann nur auf den aktuellen Satz ausgeführt werden. Damit wird sichergestellt, dass die Daten in der Infrastruktur mit denen im Modul synchronisiert werden können.

Beispiel:

sample.cbl
*get:
     EXEC TAA GET BLOB 000-pg-blob1 IN pgformt
        LENGTH INTO mylen
        DATA INTO mypointer 
    END-EXEC
    SET ADDRESS OF FOREIGNDATA TO MYPOINTER
*put:
    SET MYPOINTER TO ADDRESS OF FOREIGNDATA
    MOVE LENGTH OF FOREIGNDATA TO MYLEN
    EXEC TAA PUT BLOB 000-pg-blob1 IN pgformt 
        LENGTH FROM mylen
        DATA FROM mypointer 
     END-EXEC