¶
11.18.4. Virtuoso/PL Scrollable Cursor Examples
Example 11.11. Procedure using scrollable cursor to read the keys in batches of 20
create procedure READ_KEYS_NEXT_20 (in mask varchar, inout bm any) returns integer { --- This procedure reads the next 20 table names based on a bookmark value. declare cr static cursor for select distinct KEY_TABLE from DB.DBA.SYS_KEYS where KEY_IS_MAIN = 1 and KEY_MIGRATE_TO is NULL and KEY_TABLE like mask; declare table_name varchar; declare inx integer; inx := 1; -- no 'Row Deleted' (HY109) handling as the static cursors doesn't show the deleted rows. whenever not found goto done; open cr; -- positions on the bookmark or on the first if it is null -- and fetches the value into table_name if (bm is not null) { fetch cr bookmark bm into table_name; -- note that the value from fetch bookmark is omitted fetch cr next into table_name; } else fetch cr first into table_name; -- fetches the next 20 rows (or less) while (inx < 20) { result (table_name); inx := inx + 1; fetch cr next into table_name; } -- 20 rows were fetched - get the bookmark of the last row fetched bm := bookmark (cr); close cr; return; done: -- no more rows - set the bookmark to NULL close cr; bm := NULL; }; create procedure READ_KEYS (in mask varchar) { -- the main function (mask is a mask to be applied over the select declare table_name varchar; declare bm any; -- it'll return a resultset with a single column result_names (table_name); -- sets the bookmark to empty bm := NULL; while (1) { READ_KEYS_NEXT_20 (mask, bm); -- that's the flag for no more rows if (bm is NULL) return; } }; READ_KEYS ('%');