[firebase-br] Alterar Auto Incremento

Gladiston Santana gladiston em vidy.com.br
Qui Jan 12 14:13:32 -03 2017


Olha, estou usando o FB3 a quase 1 semana.
Eu criei essa procedure abaixo com a finalidade de reajustar todos os
sequenciadores de uma lista de tabelas especificadas separadas por virgula,
se lhe for util, pode copiar:
Eu imaginei uma situação onde um sequenciador saisse de ordem e precisasse
ser reajustado para o ID mais alto de cada tabela +1 .
Ainda tá no meu desenvolvimento, mas me parece funcional, a unica coisa que
até então não consegui resolver é identificar se o campo identificado é um
IDENTITY ou não, porque se for um campo comum, certamente vai dar pau.

EXECUTE BLOCK
returns (
    result_table varchar(255),
    result_idkey varchar(255),
    result_done varchar(1)) as
declare variable source_list varchar(8192);
declare variable l_item varchar(255);
declare variable l_lastpos integer;
declare variable l_nextpos integer;
declare variable l_npos integer;
declare variable l_idkey_max bigint = 0;
begin
  source_list='clientes.id_cliente,fornecedores.id_fornecedor';
  source_list = :source_list || ',';
  l_lastpos = 1;
  l_nextpos = position(',', :source_list, l_lastpos);
  while (:l_nextpos > 1) do
  begin
    l_item = substring(:source_list from :l_lastpos for :l_nextpos -
:l_lastpos);
    result_done='N';
    if (trim(l_item)<>'') then
    begin
      l_npos = position('.', l_item);
      if (l_npos>0) then
      begin
        result_table = substring(:l_item from 1 for l_npos - 1);
        result_idkey = substring(:l_item from l_npos +1);
        -- se a tabela existir, então captura a numeracao mais alta e a
transfere para o sequenciador
        if (exists(SELECT * FROM RDB$RELATIONS WHERE
UPPER(RDB$RELATION_NAME) = UPPER(:result_table))) then
        begin
          execute statement 'select max('||:result_idkey||') FROM
'||:result_table into :l_idkey_max;
          if (:l_idkey_max is null)
            then l_idkey_max=0;
          l_idkey_max=:l_idkey_max+1;
          execute statement 'ALTER TABLE '||:result_table||'  ALTER COLUMN
'||:result_idkey|| ' RESTART WITH '||CAST(:l_idkey_max as VARCHAR(8))||';';
          result_done = 'Y';
          suspend;
        end
      end
    end
    l_lastpos = :l_nextpos + 1;
    l_nextpos = position(',', :source_list, l_lastpos);
  end
end



Mais detalhes sobre a lista de discussão lista