Tienes toda la razón.
Cuando escribí este mensaje no me paré realmente a evaluar el contenido del ciclo.
Creo, y a lo mejor digo de nuevo una tontería, que la diferencia (en el caso concreto que motivó mi consulta) entre una u otra forma se debió a que en una forma planteé el contenido del bucle así:
Código SQL:
Ver originalDECLARE
x INTEGER;
registro RECORD;
BEGIN
x:=1;
--WHILE x < (SELECT COUNT(*) FROM prueba4)
FOR registro IN SELECT * FROM prueba4 ORDER BY id
LOOP
IF LENGTH(registro.cp)<5 THEN
UPDATE prueba4 SET cp=(lpad (cp,5,'0'))WHERE prueba4.id=x;
RAISE NOTICE'(%)',registro.cp;
END IF;
--RAISE NOTICE'(%)',x;
x:=x+1;
END LOOP;
END;
y en la otra así:
Código SQL:
Ver originalDECLARE
x INTEGER;
BEGIN
x:=1;
WHILE x < (SELECT COUNT(*) FROM prueba4)
LOOP
UPDATE prueba4 SET cp=(lpad (cp,5,'0'))WHERE prueba4.id=x AND LENGTH(cp)<5;
--RAISE NOTICE'(%)',cp.cp;
x:=x+1;
END LOOP;
END;
Pienso que la doble condición del UPDATE unido a que no hay previamente una cláusula IF que elimine algunos registros fue el determinante de que una operación fuese casi instantánea y la otra se llevase su tiempo.
Yo soy novato en las BBDD así que si digo muchas tonterías me lo decís
Y digo yo, si esto es así....¿cuando alguien trabaja con BBDD "de verdad" con millones de registros, ha de plantearse y hacer pruebas de rapidez antes de lanzarse a hacer un UPDATE o cualquier otra operación, con vistas a ahorrar tiempo?