Substituir os counts

De DTI Wiki

Ir para: navegação, pesquisa

O COUNT somente deve ser utilizado se tivermos a necessidade de saber o total exato de registros selecionados.
Para verificar se existe registro, sem a necessidade de saber o total de registros, deve-se utilizar outra técnica, como por exemplo, cursor, merge ou tratamento de exceções. COUNT(*) ou COUNT(campo) tem o mesmo efeito na performance do SQL, mesmo podendo resultar em valores diferentes.

Comonfazer.png COMO NÃO FAZER

SELECT COUNT(te.codigo) 
		INTO varcontador 
		FROM tblteste te 
		WHERE te.codigo = varcodigo;
		IF varcontador > 0 THENEND IF;



Comofazer.png COMO FAZER

CREATE OR REPLACE PROCEDURE prc_teste IS
			...
			CURSOR c_teste
				(in_codigo … ) IS
				SELECT te.codigo 
				FROM tblteste te
				WHERE te.codigo = in_codigo;BEGIN/* Para fazer uma operação se existe registro na tabela */
			OPEN c_teste (varcodigo);
			FETCH c_teste INTO r_teste;
			IF c_teste %found THEN
				...
			END IF;
			CLOSE c_teste;/* Para  inserir se registro não existe */
			BEGIN
				INSERT INTO tblteste (campo1, campo2, campo3)
				VALUES (varcodigo, var2, var3);
			EXCEPTION
				WHEN DUP_VAL_ON_INDEX THEN
					/* Tratamento da exceção */;
			END;/* Para fazer um insert ou update (UPSERT) dependendo do caso */
			merge INTO tlbteste tst
				using(SELECT varcodigo AS campo1, var2 AS campo2, var3 AS campo3 FROM dual)  nr
				ON (tst.campo1 = nr.campo1)
			WHEN matched THEN
				UPDATE SET tst.campo2 = nr.campo2, tst.campo3 = nr.campo3
			WHEN NOT matched THEN
				INSERT(tst.campo1, tst.campo2, tst.campo3)
				VALUES(nr.campo1, nr.campo2, nr.campo3);
			...
 
-- A FORMA A SEGUIR TAMBÉM É UMA OPÇÃO
v_retorno := 0;
        BEGIN
            SELECT 1
            INTO   v_retorno
            FROM   rhdesenv.ptoocorrencia po
            WHERE  po.matricula = in_matricula
            AND    po.datamarcacao = in_data
            AND    po.numcontrato = in_numcontrato
            AND    po.codsituacao IN (pkg_rhconst.K_HORAEXTRA50,
                                      pkg_rhconst.K_HORAEXTRA50NOTURNA,
                                      pkg_rhconst.K_HORAEXTRA100,
                                      pkg_rhconst.K_HORAEXTRA100NOTURNA);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                v_retorno := 0;
        END;
        RETURN(v_retorno);
END;
Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Ferramentas