- Este tópico contém 15 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por
LeloStyle.
-
AutorPosts
-
13 de julho de 2009 às 6:41 pm #87826
LeloStyle
ParticipantePessoal, 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’ thenelsif 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
13 de julho de 2009 às 6:59 pm #87827Ishii
ParticipanteOlá
O Correto seria:
elsif r1.cd_local_apolice_renovada is not null then
Sem o igual e as aspas.
[]s Ishii
13 de julho de 2009 às 7:17 pm #87828leo_jf
ParticipanteAmigo,
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…).
[]s13 de julho de 2009 às 8:13 pm #87830LeloStyle
ParticipanteValew 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_cotacaoand dt_solicitacao_instalacao is null;
begin
for r1 in c1 loopif 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.
13 de julho de 2009 às 8:20 pm #87831Ishii
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_cotacaoand dt_solicitacao_instalacao is null;
begin
for r1 in c1 loopif 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_cotacaoand 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
13 de julho de 2009 às 8:40 pm #87832LeloStyle
ParticipanteIshi 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ço13 de julho de 2009 às 8:42 pm #87834LeloStyle
ParticipanteIshi 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ço13 de julho de 2009 às 8:52 pm #87835Ishii
ParticipanteOlá,
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_cotacaoand 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_cotacaoand 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
13 de julho de 2009 às 9:22 pm #87836LeloStyle
ParticipanteIshi 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 loopif 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;13 de julho de 2009 às 9:34 pm #87838Ishii
ParticipanteOlá,
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
13 de julho de 2009 às 9:38 pm #87839LeloStyle
ParticipanteCara, 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 danglingTotal execution time 0.313 sec.
Obrigado pela paciencia !!!
Abraço LeloStyle13 de julho de 2009 às 9:45 pm #87840Ishii
ParticipanteOlá,
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
13 de julho de 2009 às 9:52 pm #87841LeloStyle
ParticipanteIshii, 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
14 de julho de 2009 às 3:55 pm #87849leorjgj
ParticipantePessoal,
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!
14 de julho de 2009 às 4:33 pm #87850rwarstat
ParticipanteExistem as ferramentas TOAD e PL/SQL Developer. Ambas são muito boas e com ótimos recursos.
Abraço,
Roberto -
AutorPosts
- Você deve fazer login para responder a este tópico.