|
5.7 Chapter Summary [Top]
-----------------------------------------------------------------------------------
Chapter 6 - FETCHING [Top]
-----------------------------------------------------------------------------------
6.1 Introduction [Top]
-----------------------------------------------------------------------------------
6.2 Cursor FETCH Loop [Top]
-----------------------------------------------------------------------------------
BEGIN
DECLARE @key_1 INTEGER;
DECLARE @non_key_1 VARCHAR ( 100 );
DECLARE @last_updated TIMESTAMP;
DECLARE @SQLSTATE VARCHAR ( 5 );
DECLARE @loop_counter INTEGER;
DECLARE c_fetch NO SCROLL CURSOR FOR
SELECT TOP 1000
t1.key_1,
t1.non_key_1,
t1.last_updated
FROM t1
WHERE t1.last_updated < DATEADD ( MONTH, -6, CURRENT DATE )
ORDER BY t1.last_updated
FOR UPDATE;
OPEN c_fetch WITH HOLD;
FETCH c_fetch INTO
@key_1,
@non_key_1,
@last_updated;
SET @SQLSTATE = SQLSTATE;
SET @loop_counter = 0;
WHILE @SQLSTATE = '00000' LOOP
SET @loop_counter = @loop_counter + 1;
MESSAGE STRING ( 'Deleting ',
@loop_counter, ', ',
@key_1, ', "',
@non_key_1, '", ',
@last_updated ) TO CONSOLE;
DELETE t1 WHERE CURRENT OF c_fetch;
IF MOD ( @loop_counter, 100 ) = 0 THEN
COMMIT;
MESSAGE STRING ( 'COMMIT after ', @loop_counter, ' rows.' ) TO CONSOLE;
END IF;
FETCH c_fetch INTO
@key_1,
@non_key_1,
@last_updated;
SET @SQLSTATE = SQLSTATE;
END LOOP;
CLOSE c_fetch;
COMMIT;
MESSAGE STRING ( 'Final COMMIT after ', @loop_counter, ' rows.' ) TO CONSOLE;
END;
-----------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqldef.h"
EXEC SQL INCLUDE SQLCA;
int main() {
EXEC SQL BEGIN DECLARE SECTION;
long key_1;
char non_key_1 [ 101 ];
char last_updated [ 24 ];
EXEC SQL END DECLARE SECTION;
char copy_SQLSTATE [ 6 ];
long loop_counter;
ldiv_t loop_counter_ldiv;
db_init( &sqlca );
EXEC SQL CONNECT USING 'ENG=test6;DBN=test6;UID=DBA;PWD=SQL';
EXEC SQL DECLARE c_fetch NO SCROLL CURSOR FOR
SELECT TOP 1000
t1.key_1,
t1.non_key_1,
DATEFORMAT ( t1.last_updated, 'yyyy-mm-dd hh:nn:ss.sss' )
FROM t1
WHERE t1.last_updated < DATEADD ( MONTH, -6, CURRENT DATE )
ORDER BY t1.last_updated
FOR UPDATE;
EXEC SQL OPEN c_fetch WITH HOLD;
EXEC SQL FETCH c_fetch INTO
:key_1,
:non_key_1,
:last_updated;
strcpy ( copy_SQLSTATE, SQLSTATE );
loop_counter = 0;
while ( strcmp ( copy_SQLSTATE, "00000" ) == 0 ) {
loop_counter = loop_counter + 1;
printf ( "Deleting %d, %d, '%s', %s\n",
loop_counter,
key_1,
non_key_1,
last_updated );
EXEC SQL DELETE t1 WHERE CURRENT OF c_fetch;
loop_counter_ldiv = ldiv ( loop_counter, 100L );
if ( loop_counter_ldiv.rem == 0 ) {
EXEC SQL COMMIT;
printf ( "COMMIT after %d rows.\n", loop_counter );
}
EXEC SQL FETCH c_fetch INTO
:key_1,
:non_key_1,
:last_updated;
strcpy ( copy_SQLSTATE, SQLSTATE );
} // while...
EXEC SQL CLOSE c_fetch;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
db_fini ( &sqlca );
printf ( "Done after %d rows.\n", loop_counter );
return ( 0 );
} // main
----------------------------------------------------------------------------------- |
|