Pular para o conteúdo
  • Este tópico contém 15 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por LeloStyle.
Visualizando 15 posts - 1 até 15 (de 16 do total)
  • Autor
    Posts
  • #87826
    LeloStyle
    Participante

      Pessoal, desculpem, pois acabei de postar um assunto no forum sobre uma rotina que precisa ser criada. Como sou inciante estou tendo dificuldades em relação a lógica pl sql dentro do begin, se tiver alguem que possa me ajudar nessa lógica ficarei grato, segue:

      Verificar se a coluna ID_TIPO_SEGURO do cursor C1 é igual a ‘R’ (Renovação Tokio). Em caso positivo:

      Verificar se a coluna CD_LOCAL_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_RAMO_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_ITEM_APOLICE_RENOVADA do cursor C1 não é nula. Em caso positivo:

      Atualizar a Data de Solicitação e a Data de Envio da Solicitação com SYSDATE

      estava iniciando essa :

      begin
      for r1 in c1 loop
      if r1.id_tipo_seguro = ‘R’ then

      elsif r1.cd_local_apolice_renovada = ‘is not null’ then

      elsif r1.cd_ramo_apolice_renovada = ‘is not null’ then

      elsif r1.cd_apolice_renovada = ‘is not null’ then

      elsif r1.cd_item_apolice_renovada = ‘is not null’ then

      Obrigadoo

      #87827
      Ishii
      Participante

        Olá

        O Correto seria:


        elsif r1.cd_local_apolice_renovada is not null then

        Sem o igual e as aspas.

        []s Ishii

        #87828
        leo_jf
        Participante

          Amigo,

          Tenha atenção também para não digitar v_variavel = null;
          Nos sistemas que dou manutenção, já encontrei a atribuição = null, e isso é um erro. Não gera erro de compilação, mas com certeza não irá buscar as informações que você precisa.
          Como escreveu o Ishii, o correto é : is not null ou is null ( v_variavel is not null…).
          []s

          #87830
          LeloStyle
          Participante

            Valew caras, mas to com essa dúvida aqui terminando aquele laço preciso chamar u update de acordo com a regra q me pedem..
            veja:

            3.1.1.1. Verificar se a coluna CD_LOCAL_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_RAMO_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_ITEM_APOLICE_RENOVADA do cursor C1 não é nula. Em caso positivo:

            3.1.1.1.1. Atualizar a Data de Solicitação e a Data de Envio da Solicitação com SYSDATE

            update pedido_item_auto_antifurto c
            set dt_solicitacao_instalacao = sysdate,
            dt_envia_solicitacao = sysdate
            where cd_pedido_cotacao = p_cd_pedido_cotacao
            and cd_item_pedido_cotacao = r1.cd_item_pedido_cotacao

            and dt_solicitacao_instalacao is null;

            begin
            for r1 in c1 loop

                if r1.id_tipo_seguro = 'R'  then
            
                elsif r1.cd_local_apolice_renovada  is not  null   then 
            
                elsif r1.cd_ramo_apolice_renovada   is not  null   then
            
                elsif r1.cd_apolice_renovada        is not  null   then
            
                elsif r1.cd_item_apolice_renovada   is not  null   then
            
                 end    if;
            

            …. preciso chamar o update…

            Desde já agradeço.

            #87831
            Ishii
            Participante

              [quote=”LeloStyle”:2dvrbzev]Valew caras, mas to com essa dúvida aqui terminando aquele laço preciso chamar u update de acordo com a regra q me pedem..
              veja:

              3.1.1.1. Verificar se a coluna CD_LOCAL_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_RAMO_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_APOLICE_RENOVADA do cursor C1 não é nula e se a coluna CD_ITEM_APOLICE_RENOVADA do cursor C1 não é nula. Em caso positivo:

              3.1.1.1.1. Atualizar a Data de Solicitação e a Data de Envio da Solicitação com SYSDATE

              update pedido_item_auto_antifurto c
              set dt_solicitacao_instalacao = sysdate,
              dt_envia_solicitacao = sysdate
              where cd_pedido_cotacao = p_cd_pedido_cotacao
              and cd_item_pedido_cotacao = r1.cd_item_pedido_cotacao

              and dt_solicitacao_instalacao is null;

              begin
              for r1 in c1 loop

                  if r1.id_tipo_seguro = 'R'  then
              
                  elsif r1.cd_local_apolice_renovada  is not  null   then 
              
                  elsif r1.cd_ramo_apolice_renovada   is not  null   then
              
                  elsif r1.cd_apolice_renovada        is not  null   then
              
                  elsif r1.cd_item_apolice_renovada   is not  null   then
              
                   end    if;
              

              …. preciso chamar o update…

              Desde já agradeço.[/quote]

              Olá,

              Então o código deveria ser:

              if r1.id_tipo_seguro = 'R' and r1.cd_local_apolice_renovada is not null and r1.cd_ramo_apolice_renovada is not null and r1.cd_apolice_renovada is not null and r1.cd_item_apolice_renovada is not null then

              update pedido_item_auto_antifurto c
              set dt_solicitacao_instalacao = sysdate,
              dt_envia_solicitacao = sysdate
              where cd_pedido_cotacao = p_cd_pedido_cotacao
              and cd_item_pedido_cotacao = r1.cd_item_pedido_cotacao

              and dt_solicitacao_instalacao is null;

              end if;

              Pois nesta situação todas as condições estão sendo atendidas e então poderá ser atualizada a linha.

              []s Ishii

              #87832
              LeloStyle
              Participante

                Ishi cara muito obrigado pois vc ta clareando muinhas dúvidas como to inciando agora.

                na continuação eu tenhooo outra condição que é essa :

                3.1.2. Verificar se a coluna ID_TIPO_SEGURO do cursor C1 é igual a ‘O’ (Congênere) e se a coluna CD_CIA_SEGURADORA do cursor C1 é igual a 5151 (Tokio Marine). Em caso positivo:

                3.1.2.1. Atualizar a Data de Solicitação e a Data de Envio da Solicitação com SYSDATE.

                update  pedido_item_auto_antifurto  c
                set dt_solicitacao_instalacao   =   sysdate,
                    dt_envia_solicitacao        =   sysdate
                where   cd_pedido_cotacao       =   p_cd_pedido_cotacao
                and     cd_item_pedido_cotacao      =   r1.cd_item_pedido_cotacao
                    and     dt_solicitacao_instalacao   is   null;
                

                uma pergunta faço outro if depois do end if e depois fecho o loop ?

                Desde já agradeço
                Abraço

                #87834
                LeloStyle
                Participante

                  Ishi cara muito obrigado pois vc ta clareando muinhas dúvidas como to inciando agora.

                  na continuação eu tenhooo outra condição que é essa :

                  3.1.2. Verificar se a coluna ID_TIPO_SEGURO do cursor C1 é igual a ‘O’ (Congênere) e se a coluna CD_CIA_SEGURADORA do cursor C1 é igual a 5151 (Tokio Marine). Em caso positivo:

                  3.1.2.1. Atualizar a Data de Solicitação e a Data de Envio da Solicitação com SYSDATE.

                  update  pedido_item_auto_antifurto  c
                  set dt_solicitacao_instalacao   =   sysdate,
                      dt_envia_solicitacao        =   sysdate
                  where   cd_pedido_cotacao       =   p_cd_pedido_cotacao
                  and     cd_item_pedido_cotacao      =   r1.cd_item_pedido_cotacao
                      and     dt_solicitacao_instalacao   is   null;
                  

                  uma pergunta faço outro if depois do end if e depois fecho o loop ?

                  Desde já agradeço
                  Abraço

                  #87835
                  Ishii
                  Participante

                    Olá,

                    Sim, fazer outro if é uma opção. Então ficaria assim:

                    for r1 in c1 loop

                    if r1.id_tipo_seguro = 'R' and r1.cd_local_apolice_renovada is not null and r1.cd_ramo_apolice_renovada is not null and r1.cd_apolice_renovada is not null and r1.cd_item_apolice_renovada is not null then

                    update pedido_item_auto_antifurto c
                    set dt_solicitacao_instalacao = sysdate,
                    dt_envia_solicitacao = sysdate
                    where cd_pedido_cotacao = p_cd_pedido_cotacao
                    and cd_item_pedido_cotacao = r1.cd_item_pedido_cotacao

                    and dt_solicitacao_instalacao is null;

                    end if;

                    if r1.id_tipo_seguro = 'O' and r1.cd_cia_seguradora = '5151' then

                    update pedido_item_auto_antifurto c
                    set dt_solicitacao_instalacao = sysdate,
                    dt_envia_solicitacao = sysdate
                    where cd_pedido_cotacao = p_cd_pedido_cotacao
                    and cd_item_pedido_cotacao = r1.cd_item_pedido_cotacao

                    and dt_solicitacao_instalacao is null;

                    end if;

                    end loop;

                    Se você notar, vai perceber que a programação PL tem bastante relação com SQL mesmo e uma estrutura tipo Pascal, o ideal sempre é ter em mente (eu prefiro no papel mesmo) um desenho lógico da condições via fluxo mesmo e só então partir para estruturação do PL.

                    Um livro bom para quem está iniciando é o

                    http://www.submarino.com.br/produto/1/177818/&franq=127565

                    Ele tem uma série de dicas e está em português com uma boa tradução…

                    []s Ishii

                    #87836
                    LeloStyle
                    Participante

                      Ishi muito obrigado cara, nem sei como agradecer !!!
                      Vou agilizar para comprar esse livro então, se souber de outras tutoriais ou tiver materiais sobre pl e forms tbm ficarei agradecido.

                      Olha só como ficou, verificae ve o q precisa ainda e se precisa de algo :

                      create or replace procedure prod4020_009(
                      p_cd_pedido_cotacao in number,
                      p_cd_versao_pedido_cotacao in number,
                      p_mens in out varchar2
                      );
                      v_saida_anormal exception;

                      cursor c1 is
                      select b.cd_item_pedido_cotacao,
                      c.cd_ramo_apolice_renovada,
                      c.cd_local_apolice_renovada,
                      c.cd_apolice_renovada,
                      c.cd_item_apolice_renovada,
                      c.id_tipo_seguro,
                      c.cd_cia_seguradora,
                      substr(lpad(c.nr_apolice_anterior,6,’0′),1,2) cd_local_apolice_congenere,
                      substr(lpad(c.nr_apolice_anterior,6,’0′),3,2) cd_ramo_apolice_congenere,
                      substr(lpad(c.nr_apolice_anterior,6,’0′),5,6) cd_apolice_congenere,
                      c.nr_item_apolice_anterior cd_item_apolice_congenere
                      from pedido_item_versao_cotacao a,
                      pedido_item_cotacao b,
                      pedido_item_cotacao_auto c
                      where a.cd_pedido_cotacao = p_cd_pedido_cotacao
                      and a.cd_versao_pedido_cotacao = p_cd_versao_pedido_cotacao
                      and a.cd_pedido_cotacao = b.cd_pedido_cotacao
                      and a.cd_item_pedido_cotacao = b.cd_item_pedido_cotacao
                      and b.cd_pedido_cotacao = c.cd_pedido_cotacao
                      and b.cd_item_pedido_cotacao = c.cd_item_pedido_cotacao;

                      begin
                      for r1 in c1 loop

                                  if r1.id_tipo_seguro =      'R'         and 
                                  r1.cd_local_apolice_renovada    is not    null  and  
                                  r1.cd_ramo_apolice_renovada     is not    null  and 
                                  r1.cd_apolice_renovada      is not    null  and 
                                  r1.cd_item_apolice_renovada     is not    null  then 
                                  -- 
                                  update   pedido_item_auto_antifurto c 
                                  set   dt_solicitacao_instalacao =   sysdate, 
                                  dt_envia_solicitacao        =   sysdate 
                                  where cd_pedido_cotacao     =       p_cd_pedido_cotacao 
                                  and cd_item_pedido_cotacao      =       r1.cd_item_pedido_cotacao 
                                  and dt_solicitacao_instalacao   is  null; 
                                      -- 
                                  end   if; 
                                  -- 
                                  if r1.id_tipo_seguro =      'O'     and 
                                  r1.cd_cia_seguradora =      '5151'      then 
                                  -- 
                                  update  pedido_item_auto_antifurto c 
                                  set dt_solicitacao_instalacao   =   sysdate, 
                                      dt_envia_solicitacao        =   sysdate 
                                  where   cd_pedido_cotacao       =       p_cd_pedido_cotacao 
                                  and cd_item_pedido_cotacao      =   r1.cd_item_pedido_cotacao 
                                  and dt_solicitacao_instalacao   is  null; 
                                  -- 
                                  end if; 
                                  -- 
                              end loop;
                      

                      exception
                      when others then
                      p_mens := ‘PROD4020_009 – Erro ao ler APOLICE. Erro: ‘||sqlerrm;
                      raise v_saida_anormal;
                      end;

                      #87838
                      Ishii
                      Participante

                        Olá,

                        Somente verifique se essa condição Hardcode deve ser mesmo assim, pois sou meio contra a soluções assim, parece um POG meio disfarçado.

                        []s Ishii

                        #87839
                        LeloStyle
                        Participante

                          Cara, desculpe a burrice, é q sou leigo ainda em pl, vc usou esses termos ai pode me expecificar melhor ?

                          Qnd tentei rodar me apareceu esse erro aqui :

                          1 Create procedure, executed in 0.297 sec. 2 PLS-00103: Encountered the symbol “V_SAIDA_ANORMAL” 67 9 PLS-00103: Encountered the symbol “V_SAIDA_ANORMAL” when expecting one of the following:

                          . ( ) , * @ % & = – + at in mod not rem
                          or != or ~= >= <= and or like
                          between is null is not || is dangling

                          Total execution time 0.313 sec.

                          Obrigado pela paciencia !!!
                          Abraço LeloStyle

                          #87840
                          Ishii
                          Participante

                            Olá,

                            Hardcode é o termo usado quando dentro do Programa tenho uma condição fixa do Banco de Dados, por exemplo, no seu caso quando for Tokio Marine o valor é 5151, mas esse valor não será sempre 5151 se alguém por alguma razão mudar o nome ou outra coisa, com isso o valor 5151 ficou dentro do código. Se você tiver que usar isso em outra base pode ser que o valor da Seguradora Tokio Marine seja 1202 por exemplo… e aí essa procedure ficaria errada…

                            Pelo que vi da estrutura da sua procedure o melhor seria comentar as linhas do exception que tem o raise v_saida_anormal;

                            Esse tipo de exception é customizado para quando você deseja que nesta situação a procedure faça alguma coisa. Por exemplo, se no update ocorresse algum erro (trigger por exemplo) você poderia colocar essa exceção e na tratativa de exception usar para alguma outra coisa.

                            []s Ishii

                            #87841
                            LeloStyle
                            Participante

                              Ishii, valew cara… conseguii aqui agora só vou tratar os erros que é um padrão da empresa aqui…
                              Em relação a material, vc tem algo sobre pl e tbm forms para quem ta começandoo ???
                              C tiver algo por favor me passe nesse email weslley_lelo@hotmail.com.

                              E mais uma vez muito obrigado.

                              Abraçoo

                              #87849
                              leorjgj
                              Participante

                                Pessoal,

                                Desculpem me intrometer, sou novato tbm em pl/sql queria saber como é o ambiente de programação vocês.

                                Vocês utilizam algum programa além do Oracle Sql Developer?

                                Existe algum outro programa que faça validação, identação, tratamento de erros, automação de rotinas ou outras funcionalidades que facilitem a programação?

                                Abraços!

                                #87850
                                rwarstat
                                Participante

                                  Existem as ferramentas TOAD e PL/SQL Developer. Ambas são muito boas e com ótimos recursos.

                                  Abraço,
                                  Roberto

                                Visualizando 15 posts - 1 até 15 (de 16 do total)
                                • Você deve fazer login para responder a este tópico.