Recreating indices 2

The following example illustrates how to recreate database indices using AS DATASET:

 execute ibeblock
 returns (info varchar(1000))
 as
 begin
   select i.rdb$index_name, i.rdb$relation_name, i.rdb$unique_flag,
          i.rdb$index_inactive, i.rdb$index_type
   from rdb$indices i
   left join rdb$relation_constraints rc on (i.rdb$index_name = rc.rdb$index_name)
   where (i.rdb$system_flag is null) and (rc.rdb$index_name is null)
   as dataset ds_indices;

   while (not ibec_ds_eof(ds_indices)) do
   begin
     IdxName = ibec_trim(ibec_ds_getfield(ds_indices,0));
     IdxRelName = ibec_trim(ibec_ds_getfield(ds_indices,1));
     IdxUnique = ibec_ds_getfield(ds_indices,2);
     IdxInactive = ibec_ds_getfield(ds_indices,3);
     IdxType = ibec_ds_getfield(ds_indices,4);

     sFields = '';
     for select rdb$field_name from rdb$index_segments
         where rdb$index_name = :IdxName
         order by rdb$field_position
         into :IdxField
     do
     begin
       IdxField = ibec_trim(IdxField);
       if (sFields <> '') then
         sFields = sFields || ', ';
       sFields = sFields || ibec_formatident(IdxField);
     end

     DropStmt   = 'drop index ' || ibec_formatident(IdxName);
     CreateStmt = 'create ' || ibec_iif(IdxUnique = 1, 'unique ', '') || ibec_iif(IdxType = 1, 'descending ', '') ||

                  ' index ' || ibec_formatident(IdxName) ||
                  ' on ' || ibec_formatident(IdxRelName) || ' (' || sFields || ')';

     info = DropStmt;
     suspend;
     ibec_progress(info);
     execute statement :DropStmt;
     commit;

     info = CreateStmt;
     suspend;
     ibec_progress(info);
     execute statement :CreateStmt;
     commit;

     ibec_ds_next(ds_indices);
   end

   close dataset ds_indices;
 end

See also:
Firebird for the Database Expert: Episode 1 - Indexes
Recreating Indices 1

back to top of page
<< Recreating indices 1 | IBEBlock | Inserting files into a database >>