|
Alan, First off, why the Select Distinct? Distinct is generally a bad performer. Not too mention, particularly in the case of exporting the 1.5 million records, you would (normally) want every record including duplicates if any; which the distinct would lose. I'd do the headers like so Set dummyVar = WriteIFS( stringToWrite ) (note if using embedded SQL, I don't know that set would work... I think instead you'd need VALUES INTO like so) /exec SQL values WriteIFS( :stringToWrite ) INTO :dummyVar Now as far as writing the detail, I think you are correct about the limitations of the prepared statement. However, I believe they can be worked around using parameter markers ( and the SQLDA ) stm = 'values Select MAX(WriteIFS(' + wDataFormatString + ') from ' + wInputFileName + ') into ?' /exec SQL prepare s from :stm I'm not sure about this, but going from the following: Table 71. Untyped Parameter Marker Usage As a value in the INTO clause of the VALUES INTO statement I think it would work. Note the use of the MAX function. I think it would be required in order to limit the results to a single row. Without the MAX, the Select WriteIFS(<...>) would normal return a result set with the same number of rows as the input file. I wouldn't use a global temp table. You'd lose mucho performance writing temporary records into the DB vs. writing directly to the IFS. Every write into a RDBMS table involves "considerable" overhead ( at least when compare to not writing into an actual table). HTH, I'm off for a four day weekend. <grin> Charles Wilt iSeries Systems Administrator / Developer Mitsubishi Electric Automotive America ph: 513-573-4343 fax: 513-398-1121 > -----Original Message----- > From: rpg400-l-bounces@xxxxxxxxxxxx > [mailto:rpg400-l-bounces@xxxxxxxxxxxx]On Behalf Of Alan Campin > Sent: Thursday, May 26, 2005 3:00 PM > To: RPG programming on the AS400 / iSeries > Subject: RE: Help improve performance of RPG program - Long Post > > > Damn, I think you have got it Charles concerning the SET. > That would solve my having to use update but it would have to > be in a program which it is going to be anyway so the program > would have the following: > > Open the stream file. > /Exec SQL Set :DummyField = > OpenIFS('/home/yourdirectory/yourfile.txt') > > Write the first header. > /Exec SQL Set :DummyField = Select Distinct > WriteIFS(Build_String_Here) From Tables > > Write the second header. > /Exec SQL Set :DummyField = Select Distinct > WriteIFS(Build_String_Here) From Tables. > > Write the 1.5 million. > /Exec SQL Set :DummyField = Select Distinct > WriteIFS(Build_String_Here From 1.5Table > > Close the stream file. > /Exec SQL Set :DummyField = CloseIFS() > > Shoot, I just spotted a problem. Everything is variable so > Writes would have to be prepared and I don't think I can use > a prepared statement with a SET or, at least, I don't know > how to do it. > > Maybe the solution is to use EXECUTE IMMEDIATE with an INSERT > into a temp table. You cannot use SELECT with EXECUTE > IMMEDIATE but I can do a "EXECUTE IMMEDIATE INSERT INTO > temp_table SELECT DISTINCT WRITEIFS(Build_String_Here) FROM > Tables" and declare the temp_table using DECLARE GLOBAL > TEMPORARY TABLE so we would end up with: > > Build the dummy file > /Exec SQL DECLARE GLOBAL TEMPORARY TABLE Temp_Table > (DummyField Char(1)) > > Open the stream file. > /Exec SQL SET :DummyField = OpenIFS('filename ') > > Write the first header > StringToExecute = 'INSERT INTO TEMP_TABLE SELECT DISTINCT > WRITEIFS(' + BuildStringHere + ') FROM ' + Tables > /Exec SQL EXECUTE IMMEDIATE :StringToExecute > > So on and so forth. Global table disappears at the end. > > As to your question about the performance, I think that > anytime you can have a system level process do the work, it > is going to be faster and since the records are never coming > into the HLL program, that makes it fast. To my way of > thinking, SQL is always going to be faster than bringing > records into a HLL program. In other words, Set at a time operations. > > Important point here is that the records are never coming > into the HLL. All the processing is going on in SQL. SQL will > read a record from the data base, format the string, call the > UDF and back to get the next record. > > I think we are almost there. Thanks so much for the help. >
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.