- Este tópico contém 11 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 5 meses atrás por
Shiono.
-
AutorPosts
-
16 de outubro de 2009 às 10:19 pm #90246
Shiono
ParticipanteOla pessoal
1º Gostaria de agradeçer as dicas que me deram no topico sobre exportar dados do Oracle para o Sql Server 2005
Turma eu sou novo com o Oracle e estou com o seguinte problema
Tenho um ERP Protheus instaldo que sofreu tantas customizaçoes que algumas funções pararam de funcionar.então eu criei o script abaixo para acertar a quantidade em reserva de um produto
o problema acontece no update eu tenho, algo esta errado no comando e eu não consigo descobrir o que é.
Se algum puder me ajudar pois já deu até reunião de diretoria
insert into SIGA.ReservaProc (RP_Data,RP_Tipo,RP_Filial,RP_Local,RP_Produto,RP_QAtual,RP_QReserva,RP_QPedido)
select distinct
sysdate
,’CPV1′ as Tipo_Peqsquisa
,b2.b2_filial as Filial_Estoque
,b2.b2_local as Local_Estoque
,b2.b2_cod as Cod_Produto
,sum(b2.b2_qatu) as Qtd_Atual
,sum(b2.b2_reserva) as Qtd_Reserva
,sum(c6.c6_qtdven) as Qtd_Pedido
from siga.sb2010 b2
inner join
siga.sc6010 c6
on b2.b2_filial = c6.c6_filial
and b2.b2_local = c6.c6_local
and b2.b2_cod = c6.c6_produto
and b2.b2_reserva > c6_qtdven
inner join
siga.sc5010 c5
on c5.c5_filial = c6.c6_filial
and c5.c5_num = c6.c6_num
where b2.d_e_l_e_t_ <> ‘*’
and c5.d_e_l_e_t_ <> ‘*’
and c6.d_e_l_e_t_ <> ‘*’
and c5_emissao >= TO_CHAR(SYSDATE-30,’YYYYMMDD’)
and c5_nota = ‘ ‘
and c5_status != ‘B’
and c6.c6_nota = ‘ ‘
and b2.b2_reserva > (b2.b2_qatu – b2.b2_reserva)
and b2.b2_reserva <> b2.b2_qatu
— and (b2.b2_qatu <> b2.b2_reserva and b2.b2_reserva <> c6.c6_qtdven)
— and b.B2_COD LIKE ‘KF0%’
group by
b2.b2_filial
,b2.b2_local
,b2.b2_cod
order by
b2.b2_cod
,b2.b2_filial
,b2.b2_local;
commit;
—
— Libera as quantidades reservadas
—
update siga.sb2010
set b2_reserva = RP_qpedido
from siga.sb2010, siga.ReservaProc
where b2_filial = RP_filial
and b2_local = RP_local
and b2_cod = RP_produto
and D_E_L_E_T_ <> ‘*’;
❓ [/b]16 de outubro de 2009 às 10:31 pm #90247rwarstat
ParticipanteQual o erro que dá no update?
16 de outubro de 2009 às 10:40 pm #90248Shiono
Participante[quote=”rwarstat”:39yb9uxw]Qual o erro que dá no update?[/quote]
SQL> update siga.sb2010
2 set b2_reserva = RP_qpedido
3 from siga.sb2010, siga.ReservaProc
4 where b2_filial = RP_filial
5 and b2_local = RP_local
6 and b2_cod = RP_produto
7 and D_E_L_E_T_ ‘*’;
from siga.sb2010, siga.ReservaProc
*
ERRO na linha 3:
ORA-00933: SQL command not properly ended16 de outubro de 2009 às 11:17 pm #90249rwarstat
ParticipanteShiono,
Tenta o seguinte:update siga.sb2010
set b2_reserva = (select RP_qpedido
from siga.sb2010, siga.ReservaProc
where b2_filial = RP_filial
and b2_local = RP_local
and b2_cod = RP_produto
and D_E_L_E_T_ ‘*’);16 de outubro de 2009 às 11:41 pm #90250Shiono
ParticipanteO Oracle atualizou 4.343.979 linhas sendo que so devia atualizar 1
eu dei um rollback16 de outubro de 2009 às 11:51 pm #90251Shiono
ParticipanteTem como fazer isto usando um cursor onde eu carrego o cursor com os dados da tabela ReservaProc e atualizo a sb2010 com estes dados.
Ai começa outro problema pois eu não domino como vazer cursores em Oracle.
Você se este é o melhor caminho? e onde eu acho um mateiral legal sobre cursor?
Desde ja muito obrigado pela ajuda.
O rollback deu certo!
16 de outubro de 2009 às 11:59 pm #90252rwarstat
ParticipanteO cursor tu pdoe fazer assim
begin
for cur_reserva (select campos from reservaproc)
loop
update sb2010
set b2_reserva = cur_reserva.rp_qpedido
where chave;
end loop;
end;A linha for cur_reserva cria um cursor chamado cur_reserva com o select que está dentro dos parênteses. Onde está campos no select tu coloca todos os campos que vai usar, inclusive a chave para fazer o update.
O loop é para fazer um loop dentro do cursor. Ele automaticamente vai fazer o controle das linhas. Quando terminar ele vai sair fora.
Recoemndo que faça isso em uma base de teste antes.
O commit tu vai ter que fazer separado, para caso dê algum problema tu pode dar um rollback.Procura aqui no GPO mesmo se tem algum mateiral de cursor.
Abraço
17 de outubro de 2009 às 12:17 am #90255rwarstat
ParticipanteShino,
Resolvi deixa a preguiça de lado e estruturei um cursor melhor para ti.BEGIN
FOR cur_reserva IN (SELECT rp_qpedido, rp_filial, rp_local, rp_produto
FROM siga.reservaproc)
LOOP
UPDATE siga.sb2010
SET b2_reserva = cur_reserva.rp_qpedido
WHERE b2_filial = cur_reserva.rp_filial
AND b2_local = cur_reserva.rp_local
AND b2_cod = cur_reserva.rp_produto
AND d_e_l_e_t_ ‘*’;
END LOOP;
END;Fiz ocm base no teu update original. Se precisar, pode colocar um where no select da tabela reservaproc.
Me desculpa se não expliquei muito bem antes, mas não é muito o meu forte ensinar.
Se precisar de algo mais posta aí.
Abraço,
Roberto17 de outubro de 2009 às 12:28 am #90258Shiono
ParticipanteRoberto pode ate não ser seu forte mas vc está ajudando bastante
Muito obrigado
17 de outubro de 2009 às 6:01 pm #90265burga
Participantetenta
update siga.sb2010 b2
set b2.b2_reserva = (select RP_qpedido
from siga.ReservaProc
where RP_filial = b2.b2_filial
and RP_local = b2.b2_local
and RP_produto = b2.b2_cod
)
where exists (select RP_qpedido
from siga.ReservaProc
where RP_filial = b2.b2_filial
and RP_local = b2.b2_local
and RP_produto = b2.b2_cod
and b2.D_E_L_E_T_ ‘*’);isso eu to considerando que a coluna D_E_L_E_T_ é da tabela siga.sb2010
depois, pra facilitar vc coloca as descrições das tabelas siga.sb2010 e siga.ReservaProc. Assim fica mais facil do que ficar adivinhando!
17 de outubro de 2009 às 6:51 pm #90266burga
Participanteopa, a ultima comparação do where, (coluna D_E_L_E_T_) tem q ficar fora dos parenteses…
21 de outubro de 2009 às 12:21 am #90321Shiono
ParticipantePessoal
Muito obrigado a todos consegui resolver este problema com a ajuda de vocês.
-
AutorPosts
- Você deve fazer login para responder a este tópico.