¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo consultar datos nulos utilizando cursores en SQL Script

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 10 Vistas
0
Cargando...

Necesito recuperar un registro utilizando un cursor cuyo valor es nulo, sin embargo, al pasar este parámetro al cursor, el registro buscado no se devuelve.

El código a continuación muestra un ejemplo. Se observa el mismo comportamiento cuando solo se pasa la primera columna como parámetro del cursor.

create table testenulo (att1 nvarchar, att2 integer)

insert into testenulo values ('a', 1);
insert into testenulo values (null, 2);
insert into testenulo values ('c', null);

create or replace procedure prc_testenulo() as
begin
	USING SQLSCRIPT_PRINT as lib;
	declare cursor c_teste(va nvarchar, vb integer) for
		select a.att1, a.att2 from testenulo a 
		where a.att1 = va and a.att2 = vb;
	
	declare vrow row like :c_teste;
		
	OPEN c_teste(null, 2);
	FETCH c_teste INTO vrow;
	
	if(c_teste::NOTFOUND) then
		lib:print_line('not found');
	else
		lib:print_line(:vrow.att1);
	end if;
end;

-- devuelve 'not found'
call prc_testenulo();

¿Cuál sería la forma de consultar datos nulos utilizando cursores en SQL Script?

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

2 Respuestas

0
Cargando...

Gracias por la respuesta. Probé aquí y tuve que hacer una modificación: ifnull debe ser compatible con el tipo de parámetro.

( a.att2 es null y ifnull(vb, 0) = 0)
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Comparar con un "=" contra Null no tiene efecto. Se debe usar IS NULL para la comparación. Una opción a considerar es algo como lo siguiente:

create or replace procedure prc_testenulo() as
        begin
            USING SQLSCRIPT_PRINT as lib;
            declare cursor c_teste(va nvarchar, vb integer) for
                select a.att1, a.att2 from testenulo a 
                where ( a.att1 = va 
                                    or ( a.att1 is null and ifnull(va, 'isNull') = 'isNull')
                                )
                            and ( a.att2 = vb 
                                    or ( a.att2 is null and ifnull(vb, 'isNull') = 'isNull')
                                );
            
            declare v_att1 nvarchar;
            declare v_att2 integer;
            
            OPEN c_teste(null, 2);
            FETCH c_teste INTO v_att1, v_att2;
            
            if(c_teste::NOTFOUND) then
                lib:print_line('not found');
            else
                lib:print_line(:v_att1);
            end if;
        end;
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?