PDA

View Full Version : EMBEDDED SQL in RPG



Ludger Muhmann
29-07-02, 20:38
Wer hat eine Idee, wie ich mein Problem bzgl. embedded SQL in RPG lösen kann.

Da ich im Bereich SQL ein Anfänger bin, stosse ich auf Probleme, die vermutlich für erfahrerene SQL-Anwender gar keine sind.

Es geht um folgendes:
In einer DECLARE-Anweisung wird ein Select über Felder von 3 Dateien durchgeführt. Dazu gibt es umfangreiche, aber eigentlich nicht schwierige WHERE-Bedingungen, in der Feldinhalte dieser Dateien verglichen werden und Vergleiche mit über UDS im RPG-Programme eingelesenen Feldinhalten erfolgen.
Nach Beendigung des DECLARES frage ich den SQLCOD ab, ob dieser ungleich 0 ist.

Hier bricht das Programm ab mit RNQ0103
"Ergebnis war ein Wert, der für das Ziel zu gross ist".

Bringe ich vorab den Inhalt von SQLCOD mit
Z-ADD in eine andere Variable und lasse mir diese mit DSPLY anzeigen, so hat diese den Wert: 077952576. Diesen Fehler-Code kann ich nirgendswo finden.

Wenn ich vor der Abfrage des SQLCOD diesen auf 0 setzte, so läuft das Programm weiter und das Ergebnis scheint, soweit ich erkennen kann, richtig zu sein.

Ungefähr dieselben Anweisungen als SELECT über STRSQL eingetippt, laufen richtig.

Worauf weist der Code 077952576 hin ?

Ich hoffe, jemand kann mir weiterhelfen.
mfg. Ludger.

B.Hauser
29-07-02, 21:34
Hallo Ludger,

wenn Du Dateien in RPG mittels SQL-Verarbeiten willst, musst Du folgende Schritte durchfürhren.
1. Cursor deklarieren
2. Cursor öffnen
3. Daten einlesen
--> erst jetzt wird der SQLCOD gesetzt
4. Cursor schliessen

Statisches SQL:
C/EXEC SQL
C+ Declare $SQLC1 Cursor for
C+ Select ......
C/END-EXEC

C/EXEC SQL
C+ Open $SQLC1
C/END-EXEC

C do *Hival
C/EXEC SQL
C+ Fetch $SQLC1 into http://www.as400-forum.de/ubb/biggrin.gifSSQL
C/END-EXEC

C if SQLCOD = 100 last Record
C leave
C endif
* C if SQLCOD < 0 Fehler
C eval $Error = 1 Fehler
C leave
C endif

Verarbeitung

C enddo
C/EXEC SQL
C+ Close $SQLC1
C/END-EXEC

B.Hauser

Ludger Muhmann
29-07-02, 22:37
Vielen Dank B.Hauser für die prompte und ausführliche Antwort.

Wenn ich dich richtig verstanden habe, so kann der SQLCOD beim DECLARE gar nicht abgefragt werden, sondern erst nach dem FETCH.
Das ist interessant.

Gibt es denn auch Möglichkeiten, einen evtl. SQL-Fehler beim DECLARE zu erkennen oder ist das gar nicht erforderlich ?

mfg. Ludger

Fuerchau
30-07-02, 09:49
Beim DECLARE ist das nicht erforderlich, da der PreCompiler bereits einen vollständigen Syntax-Check durchführt.
Andere Fehler KÖNNEN erst zur Laufzeit, sprich nach OPEN bzw. FETCH auftreten (CLOSE nicht vergessen).

Einen DECLARE / OPEN / FETCH / CLOSE benötigst du nicht, wenn der Select nur 1 Datensatz zurück gibt.
In diesem Fall reicht ein:

SELECT F1, F2, F3, ... into :F1, :F2, :F3, ...

Selbst wenn mehrere Sätze erwartet werden, kann eine Struktur verwendet werden:

ISTRU_____DS______10
I_______________1__5_F1
I_______________6_10_F2
:
:

SELECT F1, F2 into STRU ....

Es dürfen allerdings nicht mehr Sätze herauskommen als über die Struktur definiert sind.
Die Sätze können dann über die OCUR-Anweisung angesprochen werden.