clase 02/09/2026 BDD create/alter/drop create/alter trigger/procedure .. as begin end declare variable mivar vachar(100); declare variable mivar2 type of column producto.codigo; --declaracion de cursor explicito: -- 1) declaramos cursor 2) abrimos 3) usamos 4) cerramos DECLARE C_PAGO CURSOR FOR ( SELECT P.NRO,P.MONTO,SUM(PA.MONTO) AS COBRADO FROM POLIZA P INNER JOIN PAGO PA ON P.NRO = PA.NROP WHERE PA.FECHAPAGO IS NOT NULL GROUP BY P.NRO,P.MONTO ); var = valor; var = funcion(...); uso de cursores -> acceder tupla x tupla a una consulta 0..1 tupla, implicito (no requiere declaracion): SELECT A,B,C FROM WHERE INTO :VAR1,:VAR2,:VAR3; -- VAR1=A; VAR2=B; VAR3=C; -> POSICIONAL 1 TUPLA -> VAR1,VAR2,VAR3 valores de A,B,C 0 TUPLA -> VAR1,VAR2,VAR3 = NULL N TUPLAS -> Oracle, Firebird -> error, too many rows -> SQL Server, asigna la ultima tupla que recupero de la BD IF ( (SELECT A FROM WHERE ) <> 4 ) THEN BEGIN END ELSE BEGIN END 0..N tuplas, implicito: FOR SELECT A,B,C FROM WHERE INTO :VAR1,:VAR2,:VAR3 DO BEGIN ... INSERT INTO ... VALUES(.., :VAR1, :VAR2, ...) ... END 0..N tuplas, cursor explicito (requiere declaracion): --abro cursor como si fuese un archivo secuencial de donde leer OPEN C_PAGO; --condicion jromer loop eterno no estructurado WHILE(1 = 1) DO BEGIN -- intento leer una tupla del cursor C_PAGO .. FETCH C_PAGO INTO :NRO, :MONTO, :COBRADO; -- verifico si el fetch trajo tuplas o no IF ( ROW_COUNT = 0 ) THEN LEAVE; -- break END -- cerramos el cursor CLOSE C_PAGO; manejo de errores controlados 10.101.0.12/3050:/var/lib/firebird/3.0/data/bdd2026.fdb