Problema com reserva de registro (procedure)

09/06/2009

0

A empresa que trabalho comprou 100.000 números para sorteio. Esses números serão distribuídos entre as 67 filiais.

A filial 01 quer reservar 03 números, então o sistema de loja solicita para a procedure (CYBELAR_RES_NRSORTE) reservar os 03 primeiros números onde a flag está 0 (livre para venda) ´jogando´ o número da filial e a flag ´1´ para esse respectivo número dentro de um for até atingir a quantidade solicitada pela filial.
Porém no mesmo momento uma outra loja (20) quer reservar apenas 01 número, então ela chama a mesma procedure solicitando essa reserva, ocasionando a reserva do mesmo número.

A procedure:
CREATE OR REPLACE PROCEDURE CYBELAR_RES_NRSORTE(P_LOJA     IN varchar2,
                                                P_PDV      IN VARCHAR2,
                                                P_QTD      IN NUMBER,
                                                P_NROSORTE OUT varchar2,
                                                P_CONFIRMA OUT NUMBER) is
  /***********************************************************
  * PROCEDURE : CYBELAR_RES_NRSORTE                          *
  * OBJETIVO  : RESERVAR O NRSORTE P/ A LOJA E "ESCONDER"    *
                DAS DEMAIS LOJAS E OUTRAS RESERVAS           *
  * CRIACAO   : 08/05/2009                                   *
  * VERSAO    : 1.0                                          *
  * AUTOR     : FABIO A. CAMPOS CRUZ - fabioc@cybelar.com.br *
  ***********************************************************/

  pragma autonomous_transaction;

  retorno_nrsorte varchar2(5);
  ListaNrsorte    varchar2(1000);
  RETORNOCONFIRMA NUMBER;
  erro_int        varchar2(1000);
  vc_dir_log      varchar2(100);
  vc_id_log       varchar2(7) := ´CYBELAR´;
  vc_arq_log      varchar2(15) := ´NRSORTE.LOG´;
  vc_nome_pgm     varchar2(50) := ´PDV_NRSORTE´;
  vu_file         utl_file.file_type;

  VN_QTREG NUMBER := 0;

  /*cursor cur_nrosorte is
    --cursor pega numeros "livres"
      select nrosorte
        from cybelar_nrosorte
       where flguso = 0
         AND (LOJA IS NULL OR LOJA = ´´)
         and rownum < P_QTD + 1;
  
    res cur_nrosorte¬rowtype;
  */
begin
  BEGIN
    SELECT PINT_NM_DIRETORIO_LOG
      INTO VC_DIR_LOG
      FROM GEMCO_PARAMETRO_INTERFACE PINT, GEMCO_SISTEMA SIST
     WHERE PINT.PINT_CD_SISTEMA = SIST.SIST_CD_SISTEMA
       AND SIST.SIST_DS_SISTEMA = vc_nome_pgm;
  EXCEPTION
    -- SE NAO EXISTIR INFORMAR O DIRETORIO ONDE DEVERA SER
    -- GERADO O LOG DE OCORRENCIAS
    WHEN NO_DATA_FOUND THEN
      VC_DIR_LOG := ´/integra/Log´;
    WHEN TOO_MANY_ROWS THEN
      VC_DIR_LOG := ´/integra/Log´;
    WHEN OTHERS THEN
      VC_DIR_LOG := ´/integra/Log´;
  END;

  begin
    vu_file := utl_file.fopen(vc_dir_log, vc_arq_log, ´r´);
    utl_file.fclose(vu_file);
  exception
    when others then
      sp_int_gemco_gera_log(´INICIO DO LOG´,
                            vc_dir_log,
                            vc_id_log,
                            vc_arq_log,
                            sysdate,
                            null,
                            vc_nome_pgm,
                            0,
                            0,
                            0);
  end;

  sp_int_gemco_gera_log(´GERA LOG´,
                        vc_dir_log,
                        vc_id_log,
                        vc_arq_log,
                        sysdate,
                        ´INICIO DO LOG´,
                        vc_nome_pgm,
                        0,
                        0,
                        0);

  --open cur_nrosorte;
  FOR QTD IN 1..P_QTD loop
    /*fetch cur_nrosorte
      into res;
    if cur_nrosorte¬notfound then
      ERRO_INT        := NULL;
      ERRO_INT        := ´ERRO AO RESERVAR O NRSORTE PARA A LOJA ´ ||
                         P_LOJA || ´.´ || sqlerrm;
      RETORNOCONFIRMA := 1;
    
      ROLLBACK;
    
      exit;
    
    ELSE*/
    UPDATE CYBELAR_NROSORTE
       SET FLGUSO      = 1,
           LOJA        = P_LOJA,
           PDV_CAIXA   = P_PDV,
           DATANRSORTE = SYSDATE
     WHERE NROSORTE = (SELECT NROSORTE
                         FROM CYBELAR_NROSORTE
                        WHERE FLGUSO = 0
                          AND (LOJA IS NULL OR LOJA = ´´))
    RETURNING NROSORTE INTO retorno_nrsorte;
  
    COMMIT;
  
    ListaNrsorte    := retorno_nrsorte || ´|´ || ListaNrsorte;
    RETORNOCONFIRMA := 0;
    --end if;
    VN_QTREG := VN_QTREG + 1;
  end loop;

  IF VN_QTREG = 0 THEN
    ERRO_INT        := ´ERRO AO RESERVAR O NRSORTE (´ || P_NROSORTE ||
                       ´) PARA A LOJA ´ || P_LOJA || ´.´;
    RETORNOCONFIRMA := 1;
  ELSE
    ERRO_INT        := ´RESERVADO COM SUCESSO (´ || ListaNrsorte ||
                       ´). LOJA ´ || P_LOJA;
    RETORNOCONFIRMA := 0;
  END IF;

  sp_int_gemco_gera_log(´GERA LOG´,
                        vc_dir_log,
                        vc_id_log,
                        vc_arq_log,
                        sysdate,
                        erro_int,
                        vc_nome_pgm,
                        0,
                        0,
                        0);

  sp_int_gemco_gera_log(´GERA LOG´,
                        vc_dir_log,
                        vc_id_log,
                        vc_arq_log,
                        sysdate,
                        ´FIM DO LOG´,
                        vc_nome_pgm,
                        0,
                        0,
                        0);
  sp_int_gemco_gera_log(´FIM LOG´,
                        vc_dir_log,
                        vc_id_log,
                        vc_arq_log,
                        sysdate,
                        null,
                        vc_nome_pgm,
                        0,
                        0,
                        0);
  --close cur_nrosorte;
  COMMIT;

  P_CONFIRMA := RETORNOCONFIRMA;
  P_NROSORTE := ListaNrsorte;

end cybelar_res_nrsorte;


A numeração está repetindo em alguns casos, o que não pode ocorrer


Facc

Facc

Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar