Pular para o conteúdo

Fóruns SQL e PL/SQL Atribuir valor em parâmetro Responder a: Atribuir valor em parâmetro

#147679
Avatar photoJosé 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