Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fernandamrl

[Resolvido] Erro ORA-01427

Recommended Posts

O update abaixo apresenta o erro ORA-01427: a subconsulta de uma única linha retorna mais de uma linha.

 

UPDATE SIGA.SE2010 SET E2_DECRESC = (E2_VALOR*(SELECT A2_FIDE
from SIGA.SE2010 B, SIGA.SA2010 A
WHERE
A.A2_COD = B.E2_FORNECE and
A.A2_LOJA = B.E2_LOJA and
A.A2_FIDE <> 0.00 and
B.E2_SALDO = B.E2_VALOR and
B.E2_PREFIXO <> 'FID' and
B.E2_VENCTO BETWEEN '20120101' and '20131231' and
B.E2_DECRESC <> ((B.E2_VALOR * A.A2_FIDE)/100)))

 

Não estou sabendo corrigir... Preciso de ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com o "=" a query

 

SELECT A2_FIDE ... /100))

 

só pode retornar no máximo uma linha.

 

Veja se esta deve mesmo retornar mais de uma linha, senão a corriga, se ela estiver correta faça

um bloco plsql para a atualização.

 

begin
 for r in ((SELECT A2_FIDE
             from SIGA.SE2010 B, SIGA.SA2010 A
             WHERE
             A.A2_COD = B.E2_FORNECE and
             A.A2_LOJA = B.E2_LOJA and
             A.A2_FIDE <> 0.00 and
             B.E2_SALDO = B.E2_VALOR and
             B.E2_PREFIXO <> 'FID' and
             B.E2_VENCTO BETWEEN '20120101' and '20131231' and
             B.E2_DECRESC <> ((B.E2_VALOR * A.A2_FIDE)/100))))
 LOOP
   update SIGA.SE2010 set E2_DECRESC = R.A2_FIDE;
 end LOOP;
end;

 

1) Estas tabelas são microsiga, NÃO é recomendável este tipo de update a não ser que esteja muita certa disto.

2) Faça duas salvas antes de fazer isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

O intuito é preencher o campo E2_DECRESC com o resultado da formula (E2_VALOR * A2_FIDE).

Atualmente o campo da preenchido com um valor errado, gerado através de uma customização.

 

Minha query está correta?

 

Agradeço a sua preocupação, contudo, realmente é necessário.

 

Obs.: Já tenho um backup da tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º Veja o que a query (select) retorna executado separadamente.

2º Se retornar mais de um registro certifique-se de que é isto mesmo.

 

corrigindo o bloco passado

 

begin
 for r in ((SELECT A2_FIDE , b.r_e_c_n_o_ recno
             from SIGA.SE2010 B, SIGA.SA2010 A
             WHERE
             A.A2_COD = B.E2_FORNECE and
             A.A2_LOJA = B.E2_LOJA and
             A.A2_FIDE <> 0.00 and
             B.E2_SALDO = B.E2_VALOR and
             B.E2_PREFIXO <> 'FID' and
             B.E2_VENCTO BETWEEN '20120101' and '20131231' and
             B.E2_DECRESC <> ((B.E2_VALOR * A.A2_FIDE)/100))))
 LOOP
   update SIGA.SE2010 set E2_DECRESC = (E2_VALOR * R.A2_FIDE)
   where r_e_c_n_o_  = r.recno;
 end LOOP;
end;

 

O sql retorna um cursor, o update é feito para cada registro retornado.

 

Não entrei no mérito (nem tenho como) de saber se a query resolve o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.