Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #147676
    Avatar de ElizaEliza
    Participante

      Boa tarde pessoal,

      Tenho uma dúvida.

      select * from
      FROM TabelaX
      WHERE
      DTFAT >= :DTFATINI AND DTFAT <= :DTFATFIN
      AND CODEMP = :CODEMP

      Neste sql, se o usuário não informar nada nas datas inicial e final, então eu preciso que eles assumam os valores:

      dtfatini = ’01/01/2021′

      dtfatfim = sysdate

      Como atribuir valores para parâmetros de um Select  ?

       

      #147679
      Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
      Moderador

        Blz ? Não, vc não tem na linguagem SQL comandos NEM para criar NEM para popular variáveis : SUPONDO que vc já tem criadas as variáveis, o que vc PODE fazer na linguagem SQL é INDICAR VALORES SUBSTITUTOS se as variáveis estiverem nulas , tipo :

        SELECT * FROM
        FROM TabelaX
        WHERE DTFAT >= nvl(:DTFATINI, ’01/01/2021′) AND DTFAT <= nvl(:DTFATFIN, TO_CHAR(SYSDATE, ‘DD/MM/YYYY’))
        AND CODEMP = :CODEMP

        E, OBVIAMENTE, se a coluna em questão é do tipo DATE, vc TEM que passar valores com ESSE datatype, pra evitar conversão implícita ….

        EXEMPLO : vou criar minhas bind variables no sqlplus, que não permite BIND de DATEs , vou criar então como string e depois converterei pra data :

        scott@DESENV:SQL>variable V_HIREDATE_INI varchar2(10);
        scott@DESENV:SQL>variable V_HIREDATE_FIM varchar2(10);
        scott@DESENV:SQL>variable
        variável v_hiredate_ini
        tipo de dados VARCHAR2(10)

        variável v_hiredate_fim
        tipo de dados VARCHAR2(10)

        => Ok, vou solicitar a conversão da bind variable string pra DATE :

        scott@DESENV:SQL>select empno, ename, hiredate from emp where hiredate
        between TO_DATE(:v_hiredate_ini, ‘dd/mm/yyyy’) and TO_DATE(:v_hiredate_fim, ‘dd/mm/yyyy’);

        não há linhas selecionadas

        ==> ok, como a variável está vaia não achou ninguém…. AQUi entra o que vc perguntou : embora Não tenha Como vc num comando SQL introduzir valor em variável bind, vc TEM uma função que substitui NULL por outro valor , vou usar :

        scott@DESENV:SQL>ed
        Gravou file afiedt.buf

        1 select empno, ename, hiredate from emp
        2 where hiredate between TO_DATE( nvl(:v_hiredate_ini, ’01/01/2021′)
        3 , ‘dd/mm/yyyy’
        4 )
        5 and TO_DATE(nvl(:v_hiredate_fim, to_char(sysdate, ‘dd/mm/yyyy’))
        6 , ‘dd/mm/yyyy’
        7* )
        scott@DESENV:SQL>/

        EMPNO ENAME HIREDATE


        7935 PATODONALD 05/04/2021 15:08:36

        scott@DESENV:SQL>

        => agora vou preencher valores nas variáveis (o que, COMO EU DISSE, TEM que ser feito externamente á linguagem SQL) :

        scott@DESENV:SQL>exec :v_hiredate_ini := ’01/01/1981′;

        Procedimento PL/SQL concluído com sucesso.

        scott@DESENV:SQL>exec :v_hiredate_fim := ’31/12/1981′;

        Procedimento PL/SQL concluído com sucesso.

        scott@DESENV:SQL>variable
        variável v_hiredate_ini
        tipo de dados VARCHAR2(10)

        variável v_hiredate_fim
        tipo de dados VARCHAR2(10)
        scott@DESENV:SQL>print v_hiredate_ini

        V_HIREDATE_INI

        01/01/1981

        scott@DESENV:SQL>print v_hiredate_fim

        V_HIREDATE_FIM

        31/12/1981

        scott@DESENV:SQL>l
        1 select empno, ename, hiredate from emp
        2 where hiredate between TO_DATE( nvl(:v_hiredate_ini, ’01/01/2021′)
        3 , ‘dd/mm/yyyy’
        4 )
        5 and TO_DATE(nvl(:v_hiredate_fim, to_char(sysdate, ‘dd/mm/yyyy’))
        6 , ‘dd/mm/yyyy’
        7* )
        scott@DESENV:SQL>/

        EMPNO ENAME HIREDATE


        7522 JOSE 22/02/1981 18:42:48
        7499 ALLEN 20/02/1981 11:42:17
        7521 WARD 22/02/1981 18:42:48
        7566 JONES 02/04/1981 04:50:28
        7654 MARTIN 28/09/1981 00:26:34
        7698 BLAKE 01/05/1981 17:59:01
        7782 CLARK 09/06/1981 08:13:10
        7839 KING 17/11/1981 05:05:09
        7844 TURNER 08/09/1981 14:58:50
        7900 JAMES 31/01/1981 02:25:57
        7902 FORD 03/12/1981 21:56:24
        7523 CHIAPPA 22/02/1981 18:42:48

        12 linhas selecionadas.

        scott@DESENV:SQL>

        []s

        Chiappa

        #147680
        Avatar de ElizaEliza
        Participante

          Entendi.

          Vlw pela super explicação!!!

          #147683
          Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
          Moderador

            Blz, fico contente de poder ter ajudado…. Só relembro os pontos de atenção que eu indiquei, ie : DATATYPES das bind variables que vc está criando, conversão Explícita sempre, , etc….

            #147684
            Avatar de ElizaEliza
            Participante

              Simmmm….     e eu sofrendo desde cedo.

              Agora deu certo!!!

              Que bom que existe um grupo de pessoas que se ajudam!!

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