×
The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.
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.