PDA

Ver la Versión Completa : Crear procedure o lo que sea que aumente fila por fila


vivamotos
02-09-2008, 11:53:37
Saludos,

Tengo una tabla con un CAMPO ID que de momento no es llave primaria.
Pero ya tengo datos en la tabla y muchos, quisiera saber si hay algun procedure o algo que haga que ese campo aumentando en +1 su valor al cambiar de fila.

Grácias :)

duilioisola
02-09-2008, 13:26:35
Con un trigger y un generador podrías solucionar esto:


create trigger TABLA_BI0 for TABLA active before insert position 0
as
begin
if ( new.CAMPO_ID = 0 ) then new.entrada = gen_id( contador_id , 1 ) ;
end


También podrías hacer un procedimiento para recalcular el campo ID.


create procedure REORDENAR
as
declare variable clave char(8);
declare variable id integer;
begin
/* Pongo a 0 el contador */
contador = 0;
/* Recorro toda la tabla */
/* RDB$DB_KEY es un campo que identifica a cada registro */
FOR select RDB$DB_KEY from TABLA do
into :clave
DO
begin
update TABLA
set CAMPO_ID = :id
where RDB$DB_KEY=:CLAVE;
end
end

vivamotos
02-09-2008, 17:18:14
No me funciona el procedure el campo contador no se dónde lo sacas, y si lo pongo de esta forma:

begin
/* Pongo a 0 el contador */
id = 0;
/* Recorro toda la tabla */
/* RDB$DB_KEY es un campo que identifica a cada registro */
FOR select RDB$DB_KEY from USERS_LOG_ENTRADAS
into :clave
DO
begin
update USERS_LOG_ENTRADAS
set ID = :id
where RDB$DB_KEY=:CLAVE;
end
end

Funciona pero dice ROWS AFFECTED 0 :(

vivamotos
02-09-2008, 18:00:45
El campo Clave siempre queda con el valor ', sin nada, entonces al debugar no ejecuta el update porque la sentencia no es correcta.

Que puede ser?

P.D. UTILIZO FIREBIRD

duilioisola
02-09-2008, 19:35:54
No pude probarlo antes de enviarlo.
Cambié contador por id (es el nombre que queria darle)
Agregue id=id+1, para incrementar el contador.

create procedure REORDENAR
as
declare variable clave char(8);
declare variable id integer;
begin
/* Pongo a 0 el contador */
id = 0;
/* Recorro toda la tabla */
/* RDB$DB_KEY es un campo que identifica a cada registro */
FOR select RDB$DB_KEY from TABLA do
into :clave
DO
begin
/* Incremento el contador */
id = id + 1;
/* Modifico el CAMPO_ID con el contador */
update TABLA
set CAMPO_ID = :id
where RDB$DB_KEY=:CLAVE;
end
end


Ten en cuenta que si quieres que el contador está ordenado, puedes ordenar el for select ...

...
/* Recorro toda la tabla */
/* RDB$DB_KEY es un campo que identifica a cada registro */
FOR select RDB$DB_KEY from TABLA do
ORDER BY campos_a_ordenar
into :clave
DO
...

duilioisola
02-09-2008, 19:39:04
Pon el código SQL entre marcadores [ sql ] y [ / sql ], para que se pueda leer mejor.
RDB$DB_KEY se llenará con cadenas de 8 caracteres (con poco sentido para cualquiera de nosotros). De todos modos es un campo de sistema, que sirve para identificar a cada registro.
Si haces
SELECT RDB$DB_KEY FROM USERS_LOG_ENTRADAS
varas que el resultado será algo así:
0C3F78A3
947CFEBA
...

Escribo a continuación tu procedimiento corregido.

create procedure REORDENAR
as
declare variable clave char(8);
declare variable id integer;
begin
/* Pongo a 0 el contador */
id = 0;
/* Recorro toda la tabla */
/* RDB$DB_KEY es un campo que identifica a cada registro */
FOR select RDB$DB_KEY from USERS_LOG_ENTRADAS
into :clave
DO
begin
id = id + 1;
update USERS_LOG_ENTRADAS
set ID = :id
where RDB$DB_KEY=:CLAVE;
end
end