¶
       
       
        
         
                  
        
       
        
        
        
          
          
            
            
      
    
    
    
  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 ('%');
        