Tengo un problEma que me ocupa varios dias ya, y me gustaria que alguien me diera una pista de como realizar lo que quiero.
Pretendo realizar dentro de un procedimiento SQL para DB2, un bucle que recorrra los resultados de una consulta dependiente de un parametro de entrada y que dentro de este bucle se realicen consultas de seleccion y de modificacion.
Hasta ahora me he encontrado que puedo crear cursores de forma estatica (no dependientes del parametro de entrada) y recorrerlos sin problemas y dentro de los bucles puedo realizar consultas (inserts y/o updates) con un 'STMT = 'insert into...'; PREPARE S FOR STMT; EXECUTE S;' pero no leer datos.
El codigo que habia hecho era este pero no funciona...
-- El procedimiento pretende reparar la existencia de claves repetidas en una tabla asignando una clave nueva a los registros que estan mal.
CREATE PROCEDURE BDPADRON.P4_REPARAR_ORDEN(IN TABLA VARCHAR(50), IN CAMPONUM VARCHAR(50), OUT MODIFICADOS INTEGER)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE PARCIAL INTEGER;
DECLARE ORD VARCHAR(100);
DECLARE DNI_ACTUAL VARCHAR(100);
DECLARE N INTEGER;
DECLARE STMT CHAR(1000);
DECLARE FIN_PRIN INT DEFAULT 0;
--Creo un cursor que saca 2 datos el orden (un identificador) y el count(orden) que es el error que existe ya que existen registros con = orden
DECLARE C1 CURSOR FOR SELECT ORDEN, COUNT(ORDEN) AS NUM FROM TABLA GROUP BY ORDEN ORDER BY NUM DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET FIN_PRIN=1;
SET PARCIAL =0;
SET MODIFICADOS=0;
SET FIN_PRIN = 0;
OPEN C1;
FETCH C1 INTO ORD, N;
-- Para cada orden repetida
WHILE (FIN_PRIN= 0) AND (N>1) DO
-- saco un dni correspondiente a este numero de orden
SELECT DNI INTO DNI_ACTUAL FROM TABLA WHERE ORDEN= ORD;
-- acontinuacion pretendo modificar la tabla asignandole a uno de los registros con clave (orden) repetida un nuevo valor clave.
SET STMT = 'UPDATE ' || TABLA || ' SET ORDEN=(SELECT MAX(ORDEN)+1 FROM ' || TABLA || ') WHERE ORDEN=' || ORD || ' AND DNI=''' || DNI_ACTUAL || '''';
PREPARE S1 FROM STMT;
EXECUTE S1;
GET DIAGNOSTICS PARCIAL = ROW_COUNT;
SET MODIFICADOS = MODIFICADOS +PARCIAL;
-- Actulizacion a analoga a la anterior para mantener la coherencia con una tabla que hay relacionada
SET STMT = 'UPDATE BDPADRON.PERSONA SET ' || CAMPONUM || '=(SELECT MAX(ORDEN) FROM ' || TABLA || ') WHERE ORDEN=' || ORD || ' AND DNI=''' || DNI_ACTUAL || '''';
PREPARE S2 FROM STMT;
EXECUTE S2;
GET DIAGNOSTICS PARCIAL = ROW_COUNT;
SET MODIFICADOS = MODIFICADOS +PARCIAL;
FETCH C1 INTO ORD,N;
END WHILE;
CLOSE C1;
SET MODIFICADOS = 0;
END;
Muchas GRacias a todos los que hayais intentado echarme una mano, espero poder ayudaros yo tambien en algo