none
Passar a cláusula where por parametro para o Oracle. RRS feed

  • Pergunta

  •  

    Como passar a clausula where por parametro para uma procedure do oracle??

     

    Code Snippet

    PROCEDURE PR_TOPICO_FILTRO(P_CONSULTA OUT PKG_teste.PROCUR,
    V_CONDICAO VARCHAR2) IS

    BEGIN

    OPEN P_CONSULTA FOR

     

    select * from tabeladeteste tt

    where 1 = 1 "e (aqui entraria a minha variavel  V_CONDICAO)"

     

     

     

     

     

     

    sábado, 6 de setembro de 2008 19:22

Respostas

  • Gabriel,

     

    Um exemplo completo:

     

    retorna a quantidade de linhas de uma tabela de um esquema em determinada condição

    Code Snippet
    CREATE OR REPLACE FUNCTION PRC_QTLINHAS
       (PNM_TABELA  IN VARCHAR2,      
        PDS_WHERE   IN VARCHAR2 := NULL,
        PNM_ESQUEMA IN VARCHAR2 := NULL)
    RETURN INTEGER
    IS
       VQT_LINHAS INTEGER;
    BEGIN
       EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' ||
                          NVL (PNM_ESQUEMA, USER) || '.' || PNM_TABELA ||
                         ' WHERE ' || NVL (PDS_WHERE, '1=1')
       INTO   VQT_LINHAS;
       RETURN VQT_LINHAS;
    END;

     

     

    retorna a data corrente do banco de dados

    Code Snippet

     

    declare

    l_cnt varchar2(20);

    begin

    execute immediate 'select sysdate from dual'

    into l_cnt;

    dbms_output.put_line(l_cnt);

    end;

     

     

    Outros exemplos:

     

    SQL Dinâmico no Oracle

    http://www.dbasupport.com/oracle/ora9i/execute_immediate.shtml

    http://www.devmedia.com.br/articles/viewcomp.asp?comp=2852
    http://www.dbforums.com/archive/index.php/t-873977.html

     

    segunda-feira, 8 de setembro de 2008 14:23

Todas as Respostas

  • Gabriel,

     

    Code Snippet

    EXEC SQL EXECUTE IMMEDIATE concat('select * from tabeladeteste tt where 1 = 1 and ', V_CONDICAO)

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.
    sábado, 6 de setembro de 2008 20:35
  • Laercio,

    Obrigado pela atenção.

     

    Esta me voltando o seguinte erro:

     

    Code Snippet

    Error: PLS-00103: Encountered the symbol "SQL" when expecting one of the following:
          
              . ( * @ % & = - + ; < / > at in is mod remainder not rem
              <um expoente (**)> <> or != or ~= >= <= <> and or like LIKE2_
              LIKE4_ LIKEC_ between using || multiset member SUBMULTISET_
           The symbol "; was inserted before "SQL" to continue.

     

     

    Estou usando dentro de uma procedure, tem a ver?

     

    PROCEDURE PR_FILTRO(P_CONSULTA OUT PKG_TESTE.PROCUR,
    V_WHERE VARCHAR2) IS

    BEGIN


    OPEN P_CONSULTA FOR


    EXEC SQL EXECUTE IMMEDIATE concat(
    'select * from tabelateste where 1 = 1' , V_WHERE);


    end;

    sábado, 6 de setembro de 2008 21:11
  • Gabriel,

     

    Um exemplo completo:

     

    retorna a quantidade de linhas de uma tabela de um esquema em determinada condição

    Code Snippet
    CREATE OR REPLACE FUNCTION PRC_QTLINHAS
       (PNM_TABELA  IN VARCHAR2,      
        PDS_WHERE   IN VARCHAR2 := NULL,
        PNM_ESQUEMA IN VARCHAR2 := NULL)
    RETURN INTEGER
    IS
       VQT_LINHAS INTEGER;
    BEGIN
       EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' ||
                          NVL (PNM_ESQUEMA, USER) || '.' || PNM_TABELA ||
                         ' WHERE ' || NVL (PDS_WHERE, '1=1')
       INTO   VQT_LINHAS;
       RETURN VQT_LINHAS;
    END;

     

     

    retorna a data corrente do banco de dados

    Code Snippet

     

    declare

    l_cnt varchar2(20);

    begin

    execute immediate 'select sysdate from dual'

    into l_cnt;

    dbms_output.put_line(l_cnt);

    end;

     

     

    Outros exemplos:

     

    SQL Dinâmico no Oracle

    http://www.dbasupport.com/oracle/ora9i/execute_immediate.shtml

    http://www.devmedia.com.br/articles/viewcomp.asp?comp=2852
    http://www.dbforums.com/archive/index.php/t-873977.html

     

    segunda-feira, 8 de setembro de 2008 14:23