Pular para o conteúdo
  • Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 12 anos atrás por Avatar de marlontkmarlontk.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #104729
    Avatar de marlontkmarlontk
    Participante

      Bom dia,
      Hoje me deparei com uma questão do iz0-051 sobre decode que gostaria de entender o porque do erro Invalid number apenas em um caso especifico.
      Segue os sqls.

      1º)
      select ‘5’,decode(1,
      2,’teste’,
      3)”DECODE” from dual;

      ‘5’ DECODE
      — ——
      5 3

      se 1 = 2 then
      ‘teste’
      senão
      3;

      2º)
      select ‘5’,decode(1,
      2,3,
      ‘teste’)”DECODE” from dual;

      select ‘5’,decode(1,
      2,3,
      ‘teste’)”DECODE” from dual

      ORA-01722: invalid number

      Se 1 = 2 then
      3
      senão
      ‘teste’;

      O que achei estranho é que ambos misturam datatypes <>
      Mas se comparar number = number then number senao varchar erro
      number = number then varchar senao number ok.

      #104730
      Avatar de rmanrman
      Participante

        @marlontk

        Pelo que eu entendi que o seguinte, o primeiro retorno define qual tipo de dados será retornado pelo decode.

        1) O primeiro retorno é varchar2 ‘teste’ logo o retorno do decode deve ser varchar2, o numeric 3 pode ser convertido implicitamente para varchar2 ‘3’ sem nenhum problema.

        2) O primeiro retorno é um numeric 3 logo o retorno do decode dever ser numeric, o varchar2 ‘teste’ não pode ser convertido explicitamente e nem implicitamente em numeric.

        Para confirmar a ideia veja mais um caso:


        select '5'
        ,decode(1, 2, 3, '4') "DECODE"
        from dual;

        #104732
        Avatar de marlontkmarlontk
        Participante

          @Rman
          Pelo que eu entendi que o seguinte, o primeiro retorno define qual tipo de dados será retornado pelo decode.

          Realmente isso esta descrito na Documentação
          http://docs.oracle.com/cd/B19306_01/ser … ons040.htm

          “The arguments can be any of the numeric types (NUMBER, BINARY_FLOAT, or BINARY_DOUBLE) or character types.

          If expr and search are character data, then Oracle compares them using nonpadded comparison semantics. expr, search, and result can be any of the datatypes CHAR, VARCHAR2, NCHAR, or NVARCHAR2. The string returned is of VARCHAR2 datatype and is in the same character set as the first result parameter.

          If the first search-result pair are numeric, then Oracle compares all search-result expressions and the first expr to determine the argument with the highest numeric precedence, implicitly converts the remaining arguments to that datatype, and returns that datatype.”

          Verifiquei se no primeiro par de search-result fornecer o result para char funciona o resto com char ou number, mas do contrário não, ai o result força como number e a conversão força o erro.

          Procurei em alguns livros e nada, e já tinha procurado na documentação, mas não tinha lido com a devida ATENÇÃO.

          valeu.

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.
        plugins premium WordPress