Anmelden

View Full Version : Grafik per SQL in ein Blob importieren



Seiten : [1] 2

Jenne
01-04-15, 11:19
Hallo Kollegen,

ich versuche eine Grafikdatei in eine SQL Tabelle mit einem BLOB Feld zu importieren, bekomme aber immer folgende Fehlermeldung :

Nachrichten-ID . . . . : CPF503E Bewertung . . . . . . : 30
Nachrichtenart . . . . : Senderkopie
Sendedatum . . . . . . : 01.04.15 Sendezeit . . . . . . : 12:15:49

Nachricht . . . : Fehler bei benutzerdefinierter Funktion in Teildatei
QSQPTABL.
Ursache . . . . : Beim Aufrufen der benutzerdefinierten Funktion
GET_BLOB_FROM_FILE in Bibliothek QSYS2 ist ein Fehler aufgetreten. Der
Fehler trat beim Aufrufen des zugeordneten externen Programms oder
Serviceprogramms QDBSSUDF2 in Bibliothek QSYS, Programmeingangspunkt bzw.
externem Namen QSQGTBF, spezieller Name GET_BLOB_FROM_FILE_1, auf. Der
Fehler trat bei Teildatei QSQPTABL Datei QSQPTABL in Bibliothek QSYS2 auf.
Der Fehlercode ist 1. Fehlercodes und ihre Bedeutung:
1 -- Das externe Programm oder Serviceprogramm hat SQLSTATE 42926
zurückgegeben. Die vom Programm zurückgegebene Textnachricht ist: LOB- und
XML-Lokatoren sind mit COMMIT(*NONE) nicht zulässig. .

Mein SQL-Statements sehen so aus:

CREATE TABLE Lib/BILD_LZ (SP1 BLOB ( 2 M))
INSERT INTO Lib/BILD_LZ VALUES(GET_BLOB_FROM_FILE(
'/xxxxx/bilder/Bild.gif'))


Ich habe V7R2

Vielleicht kann mir einer helfen.

Herzlichen Dank im Voraus
Jenne

prsbrc
01-04-15, 11:31
Hallo.

Das funktioniert nur wenn man unter Commitment Control arbeitet (Wie der Fehler ja auch schön sagt).

Auszug wie ich das in einem SQLRPGLE gemacht hab:


System('STRCMTCTL LCKLVL(*CHG) CMTSCOPE(*ACTGRP)');

....

Exec SQL Insert Into LIB/XTABLE
(ARBFile, ARBTsp, ARBKey, ARBFak,
ARBKNr, ARBGVo, ARBGBi, ARBUArt, ARBEMa1, ARBEMa2,
ARBEMa3, ARBEMa4, ARBEMa5, ARBFax, ARBData)
Values(:gaDName, Default, :giHKey, :gaHFak, :gaHKNr,
:gdGVo, :gdGBi, :gaHUArt, :gaHEMa1, :gaHEMa2,
:gaHEMa3, :gaHEMa4, :gaHEMa5, :gaHFax,
Get_BLOB_From_File(TRIM(:gaDatei)))
With CS;

...

Exec SQL Commit;

...

System('ENDCMTCTL');


Grüße!

Jenne
01-04-15, 11:47
Hallo prsbrc,

wie Du siehst arbeite ich aber doch mit Commitment Control:


Auswahl eingeben und Eingabetaste drücken.

COMMIT-Steuerung . . . . . . . . > *CS
Namenskonvention . . . . . . . . *SYS
Anweisungsverarbeitung . . . . . *RUN
Bibliotheksauswahl . . . . . . . *LIBL
Listenart . . . . . . . . . . . *ALL
Datenaktualisierung . . . . . . *ALWAYS
Datenkopie zulässig . . . . . . *YES
Datumsformat . . . . . . . . . . *JOB
Trennzeichen für Datum . . . . . *JOB
Zeitformat . . . . . . . . . . . *HMS
Trennzeichen für Uhrzeit . . . . *JOB
Dezimalzeichen . . . . . . . . . *JOB
Sortierfolge . . . . . . . . . . *JOB
Bibliothek . . . . . . . . . .
Sprachen-ID . . . . . . . . . . *JOB

Gruß
Jenne

andreaspr@aon.at
01-04-15, 12:02
Hallo Jenne,

Die Fehlermeldung und der SQLSTT sagen aber etwas anderes:

Das externe Programm oder Serviceprogramm hat SQLSTATE 42926
zurückgegeben. Die vom Programm zurückgegebene Textnachricht ist: LOB- und
XML-Lokatoren sind mit COMMIT(*NONE) nicht zulässig.

Jenne
01-04-15, 12:15
Hallo andreaspr,

habe jetzt einmal in der SQL Sitzung F13 getätigt mit folgendem Ergebnis:


Sitzungsattribute ändern

Auswahl eingeben und Eingabetaste drücken.

Anweisungsverarbeitung . . . . *RUN *
SELECT-Ausgabe . . . . . . . . 1 1
3
COMMIT-Steuerung . . . . . . . *CS *
*
Datumsformat . . . . . . . . . *DMY *
*
Datumstrennzeichen . . . . . . '.' *
'
Zeitformat . . . . . . . . . . *HMS *
*
Zeittrennzeichen . . . . . . . ':' *
'
Datenaktualisierung . . . . . *ALWAYS *
Datenkopie zulässig . . . . . *YES *
Namenskonvention . . . . . . . *SYS *


Und da steht doch Commit-Steuerung *CS

Gruß
Jenne

Fuerchau
01-04-15, 12:51
Besser du benutzt die "LOB File Reference Variable" aus dem SQL-Programmierhandbuch.
Hier ein Beispiel dazu zum Schreiben der Info ins IFS.
Umgedreht funktioniert dies auch zum Kopieren aus dem IFS:
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/19567-BLOB-Feld-aus-SQL-Tabelle-ins-IFS-%C3%BCbertragen

andreaspr@aon.at
01-04-15, 12:52
Also wenn du im STRSQL *CS angelegt hast, dann sollte es im STRSQL auch funktionieren.
Allerdings NUR im STRSQL. Im PGM wird NICHT die Commit Einstellung vom STRSQL verwendet! Dort musst du es entweder beim Kompilieren oder wie oben gezeigt im Programm zur Laufzeit gesetzt werden.

Fuerchau
01-04-15, 12:54
Und die Frage ist, ob du die SQL-Option (beim Umwandeln oder per set Option commit=*cs;) auch im Programm definiert hast.

B.Hauser
01-04-15, 12:55
Versuch' doch mal die Commitment-Steuerung mit Commitment Scope *JOB (anstatt *ACTGRP) zu starten. Was passiert dann?

Wenn Du überigens mit embedded SQL arbeitest, würde ich die Funktion GET_BLOB_FROM_FILE erst gar nicht verwenden, sondern eine File-Referenz-Variable definierten (SYSTYPE(BLOB_FILE).
Die Datenstruktur-Unterfelder entsprechend versorgen und dann die BLOB_FILE direkt im Insert-Statement anlegen.

Dann brauchst Du auch keine Rücksicht ob und wie die Commitment Steuerung gestartet ist zu nehemen.

Birgitta

Jenne
02-04-15, 08:11
Ich habe jetzt im STRSQL mit PF13 den Eintrag Commit auf *all gesetzt und danach hat der Insert geklappt. Kleiner Tipp für Unerfahrene, danach "COMMIT" eingeben damit die Änderung auch angenommen wird.

Eine Frage habe ich noch. Wenn ich mir jetzt die Datei ansehe, steht dort nur "Pointer".
Wie kann ich überprüfen, ob die Bilder korrekt in der Tabelle sind?

Herzlichen Dank an alle
Jenne