2008-09-23 11 views

Antwort

12

Normalerweise werde ich einen Cursor erstellen und jeden Datensatz abrufen.

//*********************************************************************** 
    // Main - Main Processing Routine 
    begsr Main; 

    exsr BldSqlStmt; 

    if OpenSqlCursor() = SQL_SUCCESS; 

     dow FetchNextRow() = SQL_SUCCESS; 
     exsr ProcessRow; 
     enddo; 

     if sqlStt = SQL_NO_MORE_ROWS; 
     CloseSqlCursor(); 
     endif; 

    endif; 

    CloseSqlCursor(); 

    endsr; // Main 

Ich habe mehr Details zu dieser Antwort in a post on my website hinzugefügt.

+0

Hallo @ Mike Wills, ich war interessiert ausführlicher darüber zu lesen, aber der Link zu Ihrer Website ist gebrochen. – mike

7

Wie Mike sagte, ist die Iteration über einen Cursor die beste Lösung. Ich würde hinzufügen, um eine etwas bessere Leistung zu geben, möchten Sie vielleicht in ein Array abrufen, um in Blöcken und nicht jeweils einen Datensatz zu verarbeiten.

Beispiel:

EXEC SQL               
    OPEN order_history;            

    // Set the length             
    len = %elem(results);            

    // Loop through all the results         
    dow (SqlState = Sql_Success);          
    EXEC SQL               
     FETCH FROM order_history FOR :len ROWS INTO :results;   
    if (SQLER3 <> *zeros);             
     for i = 1 to SQLER3 by 1;   
     // Load the output    
     eval-corr output = results(i); 
     // Do something 
     endfor;       
    endif;        
    enddo;        

HTH, James R. Perkins

+0

Ich mag das ... Ich habe das vorher nicht gemacht. Ich muss es auf großen Recordsets versuchen. –