Substituir os counts
De DTI Wiki
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.
COMO NÃO FAZER
… SELECT COUNT(te.codigo) INTO varcontador FROM tblteste te WHERE te.codigo = varcodigo; IF varcontador > 0 THEN … END IF;
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;