Hallo,

hier zunächst einige Anmerkungen:
1. Hast Du das Open-Statement nur beim Kopieren vergessen oder fehlt es überhaupt?

2. Wenn Du bereits auf Release V5R4 wärst, könntest Du Dein Programm nicht kompilieren. Ab Release V5R4 muss das Set Option Statement im Source Code VOR allen anderen SQL-Statements stehen und nur ein einzige SET OPTION Statement darf angegeben werden. Beides wird in Release V5R4 abgeprüft und führt zu Compile Fehlern. Wenn Du im SET OPTION Statement mehrere Optionen angeben willst, muss Du die einzelnen Optionen nur durch Kommata trennen:
PHP-Code:
C/EXEC SQL   Set Option Commit = *NONELangIdShr = *Hex
C
/END-EXEC 
3. Die Option CLOSQLCSR = *ENDMOD ist ein Performance-Killer, zumindest dann, wenn mit statischem SQL gearbeitet wird und das Modul mehrfach aufgerufen wird. Der Grund hierfür liegt darin, dass die ODPs (Offene Datenpfade) jeweils bei Modul-Ende gelöscht werden. Bei den folgenden Aufrufen muss jeweils die komplette Optimierung oder Full Open erfolgen (z.B. Aktivierungs-Plan erstellen oder Validieren, Indices prüfen, temporäre Objekte erstellen und mit Daten füllen), alles in allem der zeitaufwändigste Prozess bei der Ausführung eines SQL-Statements. Steht CLOSQLCSR auf *ENDACTGRP können einmal geöffnete Datenpfade wiederverwendet werden, d.h. es erfolgt nur ein Pseudo-Open, sprich lediglich die Daten in den temporären Objekten werden aktualisiert.

Wenn Du sicher sein möchtest, dass Dein Cursor auch wirklich geschlossen war, mach einfach ein CLOSE unmittelbar vor dem Open-Statement (bei Statischem SQL oder dynamischem SQL mit Parameter-Markern s.u.) oder dem Prepare-Statement (bei dynamischem SQL)

5. Wenn Du nur genau dieses Statement ausführen willst, macht dynamisches SQL keinen Sinn. Bei Dynamischem SQL muss zur Laufzeit ein Syntax Check ausgeführt werden und der String in ein ausführbares SQL-Statement konvertiert werden, bevor die eigentliche Optimierung stattfindet.

6. Anstatt die Variablen zu Fuß in den String hinein zu priemeln kannst Du mit Parameter-Markern arbeiten. An der Stelle, an der Deine Variablen stehen sollen setzt Du einfach eine Fragezeichen (Parameter-Marker) in Deinem String. Die eigentlichen Variablen werden dann bei dem Open-Statement über Using angegeben.
PHP-Code:
C/EXEC SQL   Open MyCsr  Using :HostVar1, :HostVar2, ...
C/END-EXEC 
Wenn Du mit Parameter-Markern arbeitest und das gleiche Statement mit unterschiedlichen Host-Variablen-Werten ausführen willst, brauchst Du das Prepare-Statement nicht mehr erneut ausführen.

7. Du solltes nach jedem SQL-Statement entweder den SQLCOD (SQLCODE) oder den SQLSTT (SQLSTATE) beides Felder aus der SQLCA (SQL Communication Area), die vom Precompiler eingebunden wird und mit jedem ausgeführten SQL-Statement aktualisiert wird.

Birgitta