Dúvidas na procedure que lista todos os contratos

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
rafaeg.rj22
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 08 Ago 2022 2:53 pm
Localização: Brasil

Boa tarde senhores.

Meu nome é Rafael e estou com uma dúvida sobre esta procedure abaixo:

Selecionar tudo

PROCEDURE spFindContratoByAll(
        pidUsuario    in number,
        pidNumero     in varchar2(1000),
        pidFornecedor in number,
        pidSituacao   in varchar2(100),
        prc           OUT sys_refcursor)
    IS   
    v_select_string         VARCHAR2(4000):='';
    v_where                 VARCHAR2(10) : ' WHERE '
    v_where_condition       VARCHAR2(4000) := '';
    v_pNumero               VARCHAR2(1000) := '';
    v_pSituacao             VARCHAR2(100) := '';
    v_pIdFornecedor         number := 0;
    BEGIN 
        
        if(pidUsuario is null) then
         BEGIN
            if(pidFornecedor is not null) then
              BEGIN
                v_where_condition :=  ' C.IDFORNECEDOR = ' || pidFornecedor || ' ';
              END
              ELSE
                v_where_condition := '';
              end;
            end if;

            if(pidNumero is not null) then
              BEGIN
                v_where_condition :=  ' C.IDNUMERO = ' || pidNumero || ' ';
              END
              ELSE
                v_where_condition := '';
              end;
            END IF;

            IF(pidSituacao IS NOT NULL) then
              BEGIN
                v_where_condition :=  ' C.ATIVO IN ( ' || pidSituacao || ' ) ';
              END
              ELSE
                v_where_condition := '';
              END IF;
            v_where_condition := '';
         END;


         v_select_string  := 'SELECT 
                                C.IDCONTRATO, 
                                C.NUMERO,
                                C.REFERENCIA,
                                C.INICIOVIGENCIA,
                                C.FIMVIGENCIA,            
                                C.ATIVO,
                                C.DESCRICAOCONTRATO,
                                C.NOMEGERENTE,
                                C.FISCAL1,
                                C.MATRICULAFISCAL1,
                                C.FISCAL2,
                                C.MATRICULAFISCAL2,
                                C.CODIGOGERENTE,
                                C.IDFORNECEDOR, F.RAZAOSOCIAL, F.CNPJ, F.ATIVO AS FORNECEDORATIVO,
                                C.OBSERVACOES,
                                C.LICITACAO,    
                                C.DATACADASTRO    
                            FROM TB_TERC_CONTRATO C
                            INNER JOIN TB_TERC_FORNECEDOR F ON C.IDFORNECEDOR = F.IDFORNECEDOR        
                            ' || v_where_condition || ' 
                            ORDER BY F.RAZAOSOCIAL;' 


         open prc for v_select_string;
           
    end;
    END spFindContratoByAll;

A IDEIA SERIA O SEGUINTE:

ESTOU QUERENDO MONTAR UMA QUERY DE FORMA DINAMICA POR DENTRO DESSA PROCEDURE. EU TENHO A VARIÁVEL V_SELECT_STRING QUE RECEBE A QUERY. LOGO EM SEGUIDA EU TENHO V_WHERE_CONDITION ONDE EU TENHO FRAGMENTOS DE UM FILTRO.

EXEMPLO

Selecionar tudo

     IF(PIDFORNECEDOR IS NOT NULL)THEN
         V_WHERE_CONDITION := ' IDFORNECEDOR = ' || PIDFORNECEDOR || ' AND ' ;
     IF(PNUMERO IS NOT NULL)THEN
         V_WHERE_CONDITION := '  IDNUMERO = ' || PIDFORNECEDOR || ' AND ' ;

    SELECT * FROM TBL_CONTRATO
    WHERE || V_WHERE_CONDITION || ;
ESSA QUERY TERIA QUE SER MONTADA DINAMICAMENTE DESSA FORMA.

RESUMINDO: A PROCEDURE RECEBE TRÊS PARÂMETROS DE CONSULTA SENDO QUE UM DELES PODE SER PREENCHIDO OU DOIS, OU TODOS OS TRÊS, CASO NÃO SEJE ENTÃO ELE RETORNE TUDO.

MUITO OBRIGADO PELA ATENÇÃO
RAFAEL
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Você quer executar a query em vez de abrir o CURSOR ?
Se é isso, você usa EXECUTE IMMEDIATE pra rodar a query.
rafaeg.rj22
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 08 Ago 2022 2:53 pm
Localização: Brasil

Boa tarde dr_gori

seria isso mesmo, pra executar a query. O problema seria em como fazer isso. Você teria algum exemplo ou se essa lógica acima estaria correta eu nunca trabalhei com pl/sql.

A procedure retornaria uma lista de contratos.

Será que você poderia me ajudar?

obrigado pela atenção
rafaeg.rj22
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 08 Ago 2022 2:53 pm
Localização: Brasil

dr_gori

eu já modifiquei só queria saber qual seria o erro abaixo:

Selecionar tudo

Erro(703,21): PLS-00103: Encontrado o símbolo "IMMEDIATE" quando um dos seguintes símbolos era esperado:     . ( * @ % & = - + ; < / > at in é mod lembrete not rem    <um expoente (**)> <> ou != ou ~= >= <= <> e ou como like2    like4 likec entre usando || multiset membro submultiset O símbolo "." foi substituído por "IMMEDIATE" para continuar. 
Erro(751,9): PLS-00103: Encontrado o símbolo "INNER" quando um dos seguintes símbolos era esperado:     , ; for grupo having intersect menos ordem iniciar union onde    conectar 

Selecionar tudo

    PROCEDURE spFindContratoByAll(
        prc OUT sys_refcursor,
        pWhere in varchar )
    IS         
    BEGIN       
            open prc for
            execute immediate (' SELECT  
                                            C.IDCONTRATO,  C.NUMERO, C.REFERENCIA,
                                            C.INICIOVIGENCIA,
                                            C.FIMVIGENCIA,            
                                            C.ATIVO,
                                            C.DESCRICAOCONTRATO,
                                            C.NOMEGERENTE,
                                            C.FISCAL1,
                                            C.MATRICULAFISCAL1,
                                            C.FISCAL2,
                                            C.MATRICULAFISCAL2,
                                            C.CODIGOGERENTE,
                                            C.IDFORNECEDOR, F.RAZAOSOCIAL, F.CNPJ, F.ATIVO AS FORNECEDORATIVO,
                                            C.OBSERVACOES,
                                            C.LICITACAO,    
                                            C.DATACADASTRO    
                                        FROM TB_TERC_CONTRATO C
                                        INNER JOIN TB_TERC_FORNECEDOR F ON C.IDFORNECEDOR = F.IDFORNECEDOR        
                                        '||pWhere||'
                                        ORDER BY F.RAZAOSOCIAL; ' );                  
        
    END spFindContratoByAll;  
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Não tem parenteses:

Selecionar tudo

 execute immediate 'SELECT  
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes