View Full Version : SQL Programmierung - Feststellen, ob etwas gefunden wurde
Ich denke schon. Nur die Variable end_table musst du ja vorher auf 0 setzen;-).
Probiers doch einfach aus. Du kannst ja SQL-Prozeduren/Funktionen auch debuggen.
Dies funktioniert allerdings nur über einen 2. Job mit STRSRVJOB Jobname; STRDBG ServiceProgramm;
dschroeder
13-06-24, 14:13
Viele Dank. ich probiere das mal.
Andreas_Prouza
13-06-24, 14:16
SQLCODE und SQLSTATE sind auch in SQL Funktionen und Prozeduren verfügbar.
Du musst sie einfach nur declarieren, dann werden sie automatisch befüllt.
Im SQLRPGLE werden sie automatisch vom Pre-Compiler deklariert.
dschroeder
13-06-24, 14:48
Danke für die Info. Aber ich muss sie zum Abfragen hinter jeder SQL Anweisung, die ich prüfen will, immer mit
<code style="box-sizing: border-box;"> -- Status der SQL-Anweisung abrufen
GET DIAGNOSTICS SQLCODE = RETURNED_SQLCODE, SQLSTATE = RETURNED_SQLSTATE;
füllen, oder?
(Das Code Beispiel stammt von Chat GPT)
</code>
Dann habe ich deinen Code doch noch nicht verstanden. Ich mache mal ein kleines Besipiel:
In meiner Funktion will mehrere selects abschicken und jeweils wissen, ob es geklappt hat. Muss ich dann mehrmal den Continue Handler deklarieren?
Also z.B.
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET END_TABLE = 1;
select ku_name from kunden into name;
if end_table = 1 then
erzeugeError(....)
else
macheWasGueltiges(name);
end if;
select pr_preis from artikel into preis;
if end_table = 1 then
erzeugeError(....)
else
macheWasGueltiges(preis);
end if;
Meinst du das?
Oder muss ich vor jedem select den declare und den set machen?
... was hast Du denn wirklich vor? Für mich sieht das (oberflächlich betrachtet) nach einem join aus. Was passiert denn, wenn Du gefunden hast und was, wenn nicht - für mich sieht das (oberflächlich betrachtet) nach einem Zugriffsmodul aus.
D*B
PS: der KI für eine Ausrede bei ND hält.
dschroeder
13-06-24, 15:25
Das sind nur vereinfachte Beispiele. Ich schreibe eine SQL-Funktion für einen Webservice. Die Funktion liefert für bestimmte Anfragen Blobs zurück bzw. schreibts übergebene Blobs in eine Datenbank. Es sind nur bestimmte Anfragen zulässig. Deshalb gibt es mehrere if's. Das habe ich aber inzwischen durch case when ersetzt.
Mein eigentliches Problem ist wirklich nur:
Wie kann ich den SQLCOD nach einer ausgeführten SQL-Anweisung (das kann eine select oder eine update Anweisung sein) bekommen? Ich möchte erkennen, ob die Anweisung problemlos ausgeführt wurde, ob sie keinen Satz gefunden hat oder ob ein anderer Fehler (z.B. wegen Lock) aufgetreten ist.
Da ich das an mehreren Stellen im Code brauche, suche ich eine "kurze" Lösung.
Andreas_Prouza
13-06-24, 15:33
Deklariere den SQLCODE als Variable und sie wird, wie von mir schon beschrieben, automatisch von SQL befüllt.
dschroeder
13-06-24, 15:35
Ich versuche gerade folgendes (in diesem Fall für update Anweisungen):
...
case
when requestLibrary = 'EDDATJRN' and requestTable = 'IDMRBLOB' then
update idmrblob
set rb_blob = requestBlob
where rb_rec_id = requestTableId;
get diagnostics sqlcod = DB2_RETURNED_SQLCODE;
when requestLibrary = 'EDDATJRN' and requestTable = 'IDMBLOBS' then
update idmblobs
set bl_blob = requestBlob
where bl_rec_id = requestTableId;
get diagnostics sqlcod = DB2_RETURNED_SQLCODE;
else
set errorClob = DAXWS_createErrorJSON(procName, 'ERROR_INPUT_PARAM', 'Lib und/oder Table ungültig.');
end case;
if sqlcod <> 0 then
set errorClob = DAXWS_createErrorJSON(procName, 'ERROR_UPDATE',
'Update war nicht erfolgreich. SQL-Fehlercode ' concat digits(sqlcode) );
end if;
set resultClob = json_object('fehler' value errorClob format json,
'daten' value nullif(0, 0) );
return resultClob;
Wenn ich den Code ausführe, um die Funktion zu erstellen, wird jedoch die Zeile
get diagnostics sqlcod = DB2_RETURNED_SQLCODE;
angemeckert.
Position 33 Token DB2_RETURNED_SQLCODE ungültig. Gültige
Token: COMMAND_FUNCTION COMMAND_FUNCTION_CODE
DB2_RELATIVE_COST_ESTIMATE DB2_DIAGNOSTIC_CONVERSION_ERR
OR DB2_GET_DIAGNOSTICS_DIAGNOSTICS DB2_LAST_ROW
DB2_NUMBER_CONNECTIONS DB2_NUMBER_PARAMETER_MARKERS
DB2_NUMBER_RESULT_SETS DB2_NUMBER_ROWS
DB2_NUMBER_SUCCESSFUL_SUBSTMTS DB2_RETURN_STATUS
RETURN_STATUS DB2_ROW_COUNT_SECONDARY DB2_ROW_LENGTH
DB2_SQL_ATTR_CONCURRENCY DB2_SQL_ATTR_CURSOR_CAPABILITY
DB2_SQL_ATTR_CURSOR_HOLD DB2_SQL_ATTR_CURSOR_ROWSET
DB2_SQL_ATTR_CURSOR_SCROLLABLE DB2_SQL_ATTR_CURSOR_SENSI
TIVITY DB2_SQL_ATTR_CURSOR_TYPE DYNAMIC_FUNCTION
DYNAMIC_FUNCTION_CODE MORE NUMBER ROW_COUNT
TRANSACTION_ACTIVE TRANSACTIONS_COMMITTED
dschroeder
13-06-24, 16:11
Deklariere den SQLCODE als Variable und sie wird, wie von mir schon beschrieben, automatisch von SQL befüllt.
Vielen Dank, Andreas.
ich probiere es jetzt nochmal mit deiner Methode. Vielleicht habe ich eben etwas falsch gemacht.
Andreas_Prouza
13-06-24, 16:17
DECLARE SQLSTATE char(5);
DECLARE SQLcode int;