Eu sei que o Oracle faz a conversão implicita de tipos, mas tem algumas situações que isto me deixa confuso. Como o caso que eu vi recentemente. Estava analisando uma package que possui uma procedure que utiliza uma condição de um IF/ELSE com um NOT IN onde é comparado um parametro VARCHAR da propria procedure com um RETURN do tipo CHAR da function, exemplo:
Trecho da Procedure
l_num_new := trim(nvl(f_cod_new(digito => l_num_ci_dv codcia => g_cod_cia),'#'));
l_num_ant := trim(nvl(f_cod_ant(digito => l_num_ci_dv, codcia => g_cod_cia),'#'));
...
ELSE IF ( l_num_seg <> l_cod_cia
OR l_num NOT IN l_num_new,l_num_ant ) THEN
-- Ou seja, caso o l_num não contiver um dos valores do retorno da função ele entra na condição do ELSE.
Ai entra a dúvida, quem criou a function declarou o retorno da function como CHAR mas no meio do processo ao fazer o cálculo esse valor passar a ser um NUMBER, nessa hora, automaticamente o Oracle faz a conversão implicita? Por que senão deveria dar erro de tipos inválidos, correto? Mas como ele não estava dando erro em tempo de execução ele retornava para a procedure o valor numérico calculado na function, mas ao comparar um NUMBER com um VARCHAR apesar dos valores serem aparentementes iguais a condição não o reconhecia como tal. Exemplo 8 = "8" = FALSE. Por isso, ele estava entrando na condição do ELSE, porque ao comparar um numérico com um alfa ele retornava false por ser diferente mas por ter um NOT ele inverte o valor lógico satisfazendo a condição. A solução neste caso foi colocar um TO_CHAR na variavel do RETURN da function para comparar os valores com o mesmo tipo e resolveu o problema.
Att.,