>If we are going the EXECUTE BLOCK approach, which I agree would be better.  
>
>Then, the optimal logic would be:
>
>    execute block returns (id integer) as
>    declare variable Next_ID integer;
>    begin
>      ID = 1;
>      FOR
>        SELECT ID 
>        FROM Table
>        ORDER BY ID
>      INTO
>        :Next_ID
>      DO
>        Next_ID = Next_ID - 1;
>        WHILE (Next_ID >= ID) DO BEGIN
>          SUSPEND;
>          ID = ID +1;
>        END
>        ID = ID +1;
>    end

Brilliant, Sean!

Though I would suggest some minor refinement:

    EXECUTE BLOCK RETURNS (id integer) AS
      DECLARE VARIABLE Next_ID integer;
    BEGIN
      ID = 1;
      FOR
        SELECT ID 
        FROM Table
        ORDER BY ID
      INTO
        :Next_ID
      DO
      BEGIN
        WHILE (Next_ID > ID) DO BEGIN
          SUSPEND;
          ID = ID +1;
        END
        ID = ID +1;
      END 
    END

or even:

    EXECUTE BLOCK RETURNS (id integer) AS
      DECLARE VARIABLE Next_ID integer;
    BEGIN
      ID = 1;
      SELECT MIN(ID)
      FROM Table
      INTO
        :Next_ID;
      WHILE (Next_To > ID) DO
      BEGIN
        SUSPEND;
        ID = ID +1;
      END
      FOR
        WITH TMP (ID) AS /*TMP.ID will contain first record of gap*/
        (SELECT TF.ID+1
         FROM Table TF
         LEFT JOIN Table TFN ON TF.ID + 1 = TFN.ID 
         WHERE TFN.ID IS NULL)

        SELECT T.ID, MIN(TT.ID) /*TT.ID is first record after end of gap)
        FROM TMP T
        JOIN Table TT ON TF.ID < TT.ID 
        GROUP BY 1
      INTO
        :ID, :Next_ID
      DO
      BEGIN
        WHILE (Next_ID > ID) DO
        BEGIN
          SUSPEND;
          ID = ID +1;
        END
      END 
    END

Though this is more complicated logic and I am uncertain to which extent it 
benefits performance-wise.

<The rest is off topic>

>> Once again, your keen I found an error!
>
>I swear, English is my mother tongue.  Although, from the above, you'd never 
>know it!
>
>Once again, your keen *eye* found an error!

Ah, at first I wondered whether it meant 'your keen self found an error', 
referring to my irritating skill to notice minor mistakes everywhere.

I'd say the difference between a foreigner and a native English speaker is that 
some foreigners always do the same mistake, natives tend to do mistakes like 
this occasionally. I typically have a problem with the difference between RISE 
and RAISE, don't know whether I would have had less problems if English had 
been my native language. Also, I have observed one similar, but opposite, 
phenomena in Norwegian: AND and TO are pronounced identically, but spelt 
differently, and many Norwegians often write the wrong one. I think immigrants 
learning Norwegian are less prone to this mistake, though once they get fluent, 
some of them also start having this problem!

Set

Reply via email to