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:
A numeração está repetindo em alguns casos, o que não pode ocorrer
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
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)