Hallo,

In deinem Programm steht der Close noch an falscher Stelle (mit ODP's) hat das noch nichts zu tun.
Das Problem bei OPEN und CLOSE ist, dass ein Cursor nicht erneut geöffnet werden kann, wenn er bereits geöffnet ist. Da ein CLOSE eventuell auch mal vergessen wird, ist es am sichersten den Cursor unmittelbar vor dem OPEN (nochmals) zu schließen. War der Cursor zu dem Zeitpunkt geöffnet, wird er geschlossen, war er nicht geöffnet umso besser.

Bei einem Soft- oder Pseudo-Close (also einem Close im embedded SQL oder in einer SQL-Stored Procedure oder User Defined Function) wird kein wiederverwendbarer ODP gelöscht. Ein Pseudo-Close bewirkt lediglich, dass die Daten in den temporären Objekten des ODP beim nächsten Open aktualisiert werden. Über die Compile-Option CLOSQLCSR wird definiert wann ein Hard Close erfolgen soll, also entweder beim Ende der Aktivierungsgruppe oder beim Ende eines Moduls. Je nachdem wie diese Option eingestellt ist, wird der ODP entweder beim Ende des Moduls oder beim Beenden einer Aktivierungsgruppe komplett gelöscht. Im Klartext heißt das, dass bei einem erneuten Aufruf die komplette Optimierung (Full Open) mit allen Konsequenzen erneut ausgeführt werden muss.

@Ronald:
Ich würde das ganze Programm noch wie folgt kürzen:
PHP-Code:
d jahr            s              2s 0                   
d qa              s              2s 0                   
d anzahl          s              2s 0                   
                                                        
c                                                       
c
/exec sql    Set Option SrtSeq = *LangIdShr            
c
/end-exec                   
C                   Clear     Anzahl  
c                   
eval      jahr 07                 
c                   
eval      qa   02                                 
C
/Exec SQL
c
+              Select Count(Distinct(rswoc)) 
C+              Into :Anzahl 
c
+              from   grresp                           
c
+              where  rsjah = :jahr                    
c
+                and  rsqua = :qa                      
c
/end-exec                                              
                
c                   
Eval      *inlr = *On 
Birgitta