-
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!)
-
 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.
-
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 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.
-
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.
-
Danke für die Info. Aber ich muss sie zum Abfragen hinter jeder SQL Anweisung, die ich prüfen will, immer mit
-- Status der SQL-Anweisung abrufen
GET DIAGNOSTICS SQLCODE = RETURNED_SQLCODE, SQLSTATE = RETURNED_SQLSTATE;
füllen, oder?
(Das Code Beispiel stammt von Chat GPT)
-
 Zitat von dschroeder
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?
... 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.
Similar Threads
-
By harkne in forum NEWSboard Programmierung
Antworten: 16
Letzter Beitrag: 29-03-22, 17:25
-
By ILEMax in forum IBM i Hauptforum
Antworten: 16
Letzter Beitrag: 15-11-16, 07:56
-
By JonnyRico in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 20-04-05, 16:29
-
By MAA in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 29-08-04, 12:45
-
By Cheesy in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 14-07-04, 09: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