-
SQL Programmierung - Feststellen, ob etwas gefunden wurde
Guten Tag,
ich habe eine (wahrscheinlich) triviale Frage:
Ich möchte eine SQL-Funktion (UDF) schreiben. In der Funktion lese ich mit einer select Anweisung einen Satz aus einer Tabelle.
Nach der select Anweisung möchte ich möglichst einfach feststellen, ob ein Datensatz gefunden wurde.
Wenn ich das in embedded SQL im RPGLE machen würde, könnte ich einfach den SQLCOD auf 100 abfragen. Das geht aber so nicht im reinen SQL, oder?
Hier mal ein ganz einfaches Beispiel:
Code:
declare resultBlob Blob(2G) default null;
select rb_blob into resultBlob from idmrepos where re_id = 4711;
Wenn ich jetzt einfach abfrage, ob das Feld resultBlob null ist, wüsste ich nicht, ob der Key (4711) falsch war oder ob der Key korrekt war, aber das Datenbankfeld rb_blob null war.
Gibt es eine einfache Methode, das abzufragen? Am liebsten so etwas wie ("if found()") oder so.
Dieter
-
count(*) optimice for 1 row
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Der SQLCODE gibt 0, wenn gefunden, 100 bei nicht gefunden zurück.
Bei Fehlern auch was anderes.
-
Vielen Dank euch beiden. Aber ich fürchte, ihr habt die Fragestellung nicht richtig gelesen:
- Zu Baldur:
Ich möchte das in SQL programmieren. NICHT in embedded SQL im RPG !!!
Deshalb habe ich die Variable SQLCOD gar nicht, oder gibt es die auch so im SQL? - Zu Robi:
Ich will nicht mit einer extra select count -Anweisung die Abfrage nochmal wiederholen. Ich habe eine Anweisung, die mit select Daten aus einem Datensatz holt. Ich will nur wissen, ob das geklappt hat.
Im RPG würde ich den SQLCOD 100 abfragen. Aber ich bin nicht im RPG!
Oder habe ich euch falsch verstanden?
-
dann mußt du mehrere Felder holen mit mind. einem, das nicht null werden kann. z.B deine re_id
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Du hast Recht, die IBM i DB2 macht das etwas anders:
https://www.ibm.com/docs/en/i/7.4?to...-sql-procedure
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET END_TABLE = 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
SET DEPT_SALARY = NULL;
-
Zitat von Robi
dann mußt du mehrere Felder holen mit mind. einem, das nicht null werden kann. z.B deine re_id
Genau das mache ich im Moment. Ich finde es aber unschön und dachte, es gibt etwas eleganteres. Ich mache das jetzt so:
select true, rb_blob
into gefunden, resultBlob where ...
Leider muss man dazu extra eine Variable deklarieren ("gefunden"), die man z.B. im RPG nicht benötigen würde.
-
Zitat von Fuerchau
Danke für das Beispiel. Aber das finde ich ziemlich kompliziert für so eine eigentlich einfache Sache.
Man kann sich wohl auch mit GET DIAGONOSTICS die Info besorgen. Aber das ist alles relativ viel Code für eine einfach found-Abfrage, finde ich.
Aber ich bin beruhigt: Eure Beispiele zeigen mir, dass ich da wohl keine triviale Lösung übersehen habe.
Nochmals Danke an euch beide.
-
Ob ich nun
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET END_TABLE = 1;
oder
if SQLCODE <> 0
SET END_TABLE = 1;
kodiere, ist doch jetzt nicht der große Unterschied.
-
Zitat von Fuerchau
Ob ich nun
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET END_TABLE = 1;
oder
if SQLCODE <> 0
SET END_TABLE = 1;
kodiere, ist doch jetzt nicht der große Unterschied.
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.
Code:
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?
-
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;
-
Viele Dank. ich probiere das mal.
Similar Threads
-
By harkne in forum NEWSboard Programmierung
Antworten: 16
Letzter Beitrag: 29-03-22, 16:25
-
By ILEMax in forum IBM i Hauptforum
Antworten: 16
Letzter Beitrag: 15-11-16, 06:56
-
By JonnyRico in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 20-04-05, 15:29
-
By MAA in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 29-08-04, 11:45
-
By Cheesy in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 14-07-04, 08:28
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks