SQL - bucles anidados recorriendo dos cursores

 
Vista:

bucles anidados recorriendo dos cursores

Publicado por Pablo Taminelli (4 intervenciones) el 31/05/2007 21:52:49
Hola
Tengo el siguiente error en un procedimiento almacenado

Cursorfetch: The number of variables declared in the INTO list must match that of selected columns.

pero la cantidad de variables que uso aparentemente es correcta: el procedimiento es el siguiente

ALTER PROCEDURE [dbo].[CtaCte_CrearTabla]
@idSeccion int

AS
DECLARE @idAlumno int, @idFamilia int, @idCuota int, @Desc_Cuota varchar(50), @Anio char(4)

DECLARE oAlumnos CURSOR FOR Select idAlumno, idFamilia From Alumnos Where idSeccion=@idSeccion
DECLARE oCuotas SCROLL CURSOR FOR Select idCuota, Descripcion, Anio From Cuotas Where idSeccion=@idSeccion

OPEN oAlumnos
OPEN oCuotas

FETCH NEXT FROM oAlumnos INTO @idAlumno, @idFamilia
WHILE (@@FETCH_STATUS = 0)
BEGIN

FETCH FIRST FROM oCuotas INTO @idCuota, @Desc_Cuota, @Anio
WHILE (@@FETCH_STATUS = 0)
BEGIN

INSERT INTO CtaCte
(
idFamilia,
idAlumno,
idSeccion,
Anio,
idCuota,
Descripcion
)
VALUES
(
@idFamilia,
@idAlumno,
@idSeccion,
@Anio,
@idCuota,
@Desc_Cuota
)

FETCH NEXT FROM oCuotas INTO @idCuota, @Desc_Cuota, @Anio
END

FETCH NEXT FROM oAlumnos INTO @idAlumno
END

CLOSE oAlumnos;
DEALLOCATE oAlumnos;
CLOSE oCuotas;
DEALLOCATE oCuotas;

Agradezco cualquier sugerencia
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:bucles anidados recorriendo dos cursores

Publicado por Pablo Taminelli (4 intervenciones) el 31/05/2007 22:52:52
Listo !!!!!!!!! Ya encotre el problema. Gracias igualmente
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:bucles anidados recorriendo dos cursores

Publicado por Isaías (5072 intervenciones) el 01/06/2007 17:36:00
Abres 2 cursores (maligno para sql server), no le haces ninguna operacion a tus datos y los insertas en una tabla, ¿No lo puedes hacer DIRECTAMENTE sin cursores?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:bucles anidados recorriendo dos cursores

Publicado por Jeao (1 intervención) el 19/10/2017 23:13:00
¿Como lo harias tu sin cursores?... Tengo un problema similar, y estoy usando cursores a falta de mejor idea... Pero de verdad me gustaria no usarlos... Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:bucles anidados recorriendo dos cursores

Publicado por Francisco Amadeo (1 intervención) el 04/03/2016 03:01:26
Como lo solucionaste yo tengo el mismo problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:bucles anidados recorriendo dos cursores

Publicado por Neville (1 intervención) el 11/10/2022 22:43:12
yo tengo un problema parecido necesito guardar datos de la tabla inserted y de la tabla deleted en el mismo registro de la tabla que audita pero cuando hago el update no funciona el trigger, les dejo el codigo a ver si me pueden ayudar...

ALTER TRIGGER [dbo].[TAU_AUDITOR] ON [SWNOMMSSQL000002].[dbo].[swnomper]
AFTER UPDATE AS

declare

@LI_ID INT, --Id de tabla T_Auditor
@LI_COUNT INT, --Contador para cursor inserted, para correr 1 vez por corrida del cursor deleted

@LI_CEDULA INT, --[CEDULA]
@LI_CODPRO INT, --[CODPRO]
@LI_TIPNOM INT, --[TIPNOM]
@LI_CODSUC INT, --[CODSUC]
@LI_CODDIR INT, --[CODDIR]
@LI_CODVP INT, --[CODVP]
@LI_CODGER INT, --[CODGER]
@LI_CODDEP INT, --[CODDEP]
@LS_ESTADO VARCHAR(15), --[ESTADO]
@LI_SUESAL INT, --[SUESAL]
@LS_NOMBRE VARCHAR(25), --[NOMBRES]
@LS_APELLID VARCHAR(25), --[APELLIDOS]

@LI_CEDULA_OLD INT, --[CEDULA]
@LI_CODPRO_OLD INT, --[CODPRO]
@LI_TIPNOM_OLD INT, --[TIPNOM]
@LI_CODSUC_OLD INT, --[CODSUC]
@LI_CODDIR_OLD INT, --[CODDIR]
@LI_CODVP_OLD INT, --[CODVP]
@LI_CODGER_OLD INT, --[CODGER]
@LI_CODDEP_OLD INT, --[CODDEP]
@LS_ESTADO_OLD VARCHAR(15), --[ESTADO]
@LI_SUESAL_OLD INT, --[SUESAL]
@LS_NOMBRE_OLD VARCHAR(25), --[NOMBRES]
@LS_APELLID_OLD VARCHAR(25), --[APELLIDOS]

@LS_DATA_OLD VARCHAR(150), --String con todos los datos antes de los cambios
@LS_DATA_NEW VARCHAR(150), --String con todos los cambios realizados
@LS_USER VARCHAR(50);

--Desactivando notificaciones de actualizacion

SET NOCOUNT ON

--Inicializacion de las variables nuevas

SELECT @LI_CEDULA = 0, @LI_CODPRO = 0, @LI_TIPNOM = 0, @LI_CODSUC = 0, @LI_CODDIR = 0,
@LI_CODVP = 0, @LI_CODGER = 0, @LI_CODDEP = 0, @LS_ESTADO = '', @LI_SUESAL = 0,
@LS_NOMBRE = '', @LS_APELLID = '',

--Inicializacion de las variables antiguas

@LI_CEDULA_OLD = 0, @LI_CODPRO_OLD = 0, @LI_TIPNOM_OLD = 0, @LI_CODSUC_OLD = 0,
@LI_CODDIR_OLD = 0, @LI_CODVP_OLD = 0, @LI_CODGER_OLD = 0, @LI_CODDEP_OLD = 0,
@LS_ESTADO_OLD = '', @LI_SUESAL_OLD = 0, @LS_NOMBRE_OLD = '', @LS_APELLID_OLD = '',

@LS_DATA_OLD = '', @LS_DATA_NEW = '', @LI_ID = 0, @LS_USER = '';

--Incrementar el id
SELECT @LI_ID = CASE
WHEN MAX (id) IS NULL THEN 1
ELSE MAX (id) + 1
END
FROM db_pruebas.dbo.T_Auditor

--Captura del Usuario
SELECT @LS_USER = USER;

--Declaracion de cursor para tabla inserted

DECLARE DELETED_CURSOR CURSOR FOR
SELECT CEDULA, CODPRO, TIPNOM, CODSUC, CODDIR, CODVP,
CODGER, CODDEP, ESTADO, SUESAL, NOMBRES, APELLIDOS
FROM DELETED

OPEN DELETED_CURSOR

--Insertar registros en las variables

FETCH NEXT FROM DELETED_CURSOR INTO @LI_CEDULA_OLD, @LI_CODPRO_OLD, @LI_TIPNOM_OLD, @LI_CODSUC_OLD, @LI_CODDIR_OLD,
@LI_CODVP_OLD, @LI_CODGER_OLD, @LI_CODDEP_OLD, @LS_ESTADO_OLD, @LI_SUESAL_OLD,
@LS_NOMBRE_OLD, @LS_APELLID_OLD
WHILE @@FETCH_STATUS = 0
BEGIN
--Se coloca el cursor en 1 para que el cursor haga 1 sola corrida
SET @LI_COUNT = 1;

--Declaracion de cursor para tabla inserted

DECLARE INSERTED_CURSOR CURSOR FOR
SELECT CEDULA, CODPRO, TIPNOM, CODSUC, CODDIR, CODVP,
CODGER, CODDEP, ESTADO, SUESAL, NOMBRES, APELLIDOS
FROM INSERTED

OPEN INSERTED_CURSOR

--Concatenar a un String todos los campos borrados para ver la traza
SELECT @LS_DATA_OLD = CONCAT (@LI_CEDULA_OLD, '//', @LI_CODPRO_OLD, '//', @LI_TIPNOM_OLD, '//', @LI_CODSUC_OLD,
'//', @LI_CODDIR_OLD, '//', @LI_CODVP_OLD, '//', @LI_CODGER_OLD, '//', @LI_CODDEP_OLD,
'//', @LS_ESTADO_OLD,'//', @LI_SUESAL_OLD, '//', @LS_NOMBRE_OLD, '//', @LS_APELLID_OLD)
--Incrementar el id

SELECT @LI_ID = CASE
WHEN MAX (id) IS NULL THEN 1
ELSE MAX (id) + 1
END
FROM db_pruebas.dbo.T_Auditor

BEGIN
FETCH NEXT FROM INSERTED_CURSOR INTO @LI_CEDULA, @LI_CODPRO, @LI_TIPNOM, @LI_CODSUC, @LI_CODDIR,
@LI_CODVP, @LI_CODGER, @LI_CODDEP, @LS_ESTADO, @LI_SUESAL,
@LS_NOMBRE, @LS_APELLID
-- Condicion para que el cursor solo haga una corrida
while @LI_COUNT = 1

--Se concatenan todos los valores del registro afectados actualizados
SELECT @LS_DATA_NEW = CONCAT (@LI_CEDULA,'//',@LI_CODPRO,'//',@LI_TIPNOM,'//',@LI_CODSUC,'//',@LI_CODDIR,'//',
@LI_CODVP,'//',@LI_CODGER,'//',@LI_CODDEP,'//',@LS_ESTADO,'//',@LI_SUESAL,'//',
@LS_NOMBRE,'//',@LS_APELLID)
BEGIN

INSERT INTO [db_pruebas].[dbo].[T_Auditor] (id, accion, datos_ingresados, datos_ingresados_old,
usuario, fecha, hora, host, tabla_modificada)

VALUES (@LI_ID, 'UPDATE', @LS_DATA_NEW, @LS_DATA_OLD, @LS_USER,
CONVERT (date, GETDATE()), CONVERT (time, GETDATE()), HOST_NAME(), 'swnomper')

FETCH NEXT FROM DELETED_CURSOR INTO @LI_CEDULA_OLD, @LI_CODPRO_OLD, @LI_TIPNOM_OLD, @LI_CODSUC_OLD, @LI_CODDIR_OLD,
@LI_CODVP_OLD, @LI_CODGER_OLD, @LI_CODDEP_OLD, @LS_ESTADO_OLD, @LI_SUESAL_OLD,
@LS_NOMBRE_OLD, @LS_APELLID_OLD

FETCH NEXT FROM INSERTED_CURSOR INTO @LI_CEDULA, @LI_CODPRO, @LI_TIPNOM, @LI_CODSUC, @LI_CODDIR,
@LI_CODVP, @LI_CODGER, @LI_CODDEP, @LS_ESTADO, @LI_SUESAL,
@LS_NOMBRE, @LS_APELLID

--Se coloca el cursor en 0 para que no cumpla la condicion

SET @LI_COUNT = 0;

END
END
END

--Cerrado de cursores
CLOSE DELETED_CURSOR
CLOSE INSERTED_CURSOR

--Vaciado de cursores de la memoria
DEALLOCATE DELETED_CURSOR
DEALLOCATE INSERTED_CURSOR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de German Sanchez

RE:bucles anidados recorriendo dos cursores

Publicado por German Sanchez (1 intervención) el 30/07/2009 23:03:15
Mira donde cierra el bucle del final

FETCH NEXT FROM oAlumnos INTO @idAlumno

faltal la variable , @idFamilia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar