I don't anything "technically" wrong... I would suggest though that you change it from a prepared statement to a regular statement using a host variable. 
i.e.  
Begsr mysr
       
        Exec SQL
          Declare C2 Cursor For 
           Select * from myfile 
           Where myfield = char(:someDateField);
        Exec SQL
          Open C2;
        If SqlCod < 0;
          //Treat error
        EndIf;
        DoU SqlCod <> 0;
          Exec SQL
            Fetch Next from C2 Into :MyFile_DS;
            If SqlCod < 0;
               Leave;
            Endif;
            ... 
            Leave;
        EndDo;
        Exec SQL
          Close C2;
        EndSr;
Doing it this way will prevent the prepare from occurring over and over again.  
To answer the other question, a chain wouldn't work because the original programmer must have thought that he could get multiple records from this file based on the where clause. That being said, a regular I/O setll and reade would have been just as good.  
Something else to keep in mind about SQL.  If you write SQL code correctly, you wouldn't have to make compile changes to programs using SQL.  However, since the programmer did a "select * "  into the DSPECS of the formatted like the external file, this program would need to be recompiled because the DSPECS would have changed and you would likely get sqlcod other than 0.  Try to convince the programmer to select only the fields they need. This will also help with the data retrieval in the fetch statement. 
-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of David FOXWELL
Sent: Tuesday, October 12, 2010 6:50 AM
To: RPG programming on the IBM i / System i
Subject: RE: Astonished by embedded sql
-----Message d'origine-----
De : rpg400-l-bounces@xxxxxxxxxxxx 
[mailto:rpg400-l-bounces@xxxxxxxxxxxx] De la part de Dennis Lovelady
It seems to me that this is the equivalent of opening 
myfile for each 
subroutine call, reading every record in the file then closing the 
file again.
Yes, that's right.
Although I'm not sure about the reading. Is the whole file 
read at the 
open cursor statement?
No, but it is read in its entirety at the DoU loop.  (FETCH does the
lifting.)
Thanks, Dennis. But if the FETCH was executed more than once, it wouldn't be read in its entirety a second time, would it?
By the way, I didn't think FETCH into *qualified* DS did 
quite what we would hope.  Perhaps I am mistaken on that.
I didn't even notice. That's going too far! How do you suggest breaking all this to the person who wrote it?
As an Amazon Associate we earn from qualifying purchases.