Me gustaría proponer la siguiente "pequeña" modificación al procedimiento que nos muestra
lbuelvas, para que sea probado y comentar sobre los resultados obtenidos...
Teniendo en cuenta que todas las tablas de Firebird tienen el campo
rdb$db_key, del cual parece, se puede usar unicamente dentro de la misma "transacción", entonces probemos lo siguiente y comentar si les ha parecido mas rapido, igual, mas lento o si hizó o no... lo que tenia que hacer.
Código SQL
[-]create or alter procedure SP_RE_NUMERAR (
CONSECUTIVO integer)
as
DECLARE VARIABLE ID CHAR(8);
begin
-- Procedimiento para llenar el campo 'datos.valor' con un consecutivo de
-- forma que al consultar la tabla 'datos' ordenado por el campo 'datos.valor'
-- los registros se vean ordenados por los campos 'datos.fecha' y
-- 'datos.numero'.
if (consecutivo is null) then
consecutivo = 1;
for select datos.rdb$db_key
from datos
order by datos.fecha, datos.numero
into :id
do begin
update datos
set datos.valor = :consecutivo
where datos.id = :id;
consecutivo = consecutivo + 1;
end
end^
Dicen que es mas rapido, que incluso la llave primaria... esta es una posible buena oportunidad, para probar si es eso cierto o no

.