Avalados por :

Como consultar dados nulos usando cursores em SQL Script

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

Preciso recuperar um registro usando um cursor cujo valor é nulo, no entanto, ao passar esse parâmetro para o cursor, o registro procurado não é retornado.

O código abaixo mostra um exemplo. O mesmo comportamento é observado quando apenas a primeira coluna é passada como parâmetro para o 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;

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

Qual seria a forma de consultar dados nulos usando cursores em SQL Script?

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

2 Respuestas

0
Cargando...

Obrigado pela resposta. Eu tentei aqui e tive que fazer uma modificação: ifnull deve ser compatível com o tipo de parâmetro.

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

Comparar com um "=" contra Null não tem efeito. Deve-se usar IS NULL para comparação. Uma opção a considerar é algo como o seguinte:

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?