Erro ORA-01427 ao executar UPDATE

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
zedd
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 11 Ago 2010 2:20 pm
Localização: Bahia

Boa tarde/dia/noite,

Estou inicando minha vida no mundo Oracle e to passando por um probleminha meio chato, mas espero que possam me ajudar.

Estou desenvolvendo um script onde tem uma coluna numa tabela que não estou conseguindo fazer a atualizacao.

Nesta coluna deve ser armazenado o somatorio de itens vendidos por todos os vendedores de um determinado item, porem quando executo da erro

Selecionar tudo

ORA-01427: single-row subquery returnsmore then une row
O select puro roda certinho, mas quando utilizo dentro do update da pau. já pesquisei em diversos sites, reolhei a estrutura e outros testes mas não deu em nada. Como posso fazer para então conseguir fazer esta atualizacao no campo?

Segue abeixo o codigo:

Selecionar tudo

UPDATE vendas SET unidades =(
SELECT
   NVL(vend1,0)+NVL(vend2,0)+NVL(vend3,0)+NVL(vend4,0)+NVL(vend5,0)+NVL(vend6,0)+NVL(vend7,0)+NVL(vend8,0)
       FROM
              vendas);
Esta faltando inserir ou retirar alguma coisa? :?: :?: :?:

Obrigado ai pela atencao! :wink:
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Error:
ORA-01427: single-row subquery returns more than one row

Cause:
You tried to execute an SQL statement that contained a subquery that returns more than one row.

Action:
The options to resolve this Oracle error are:

1. Rewrite your query so that the subquery only returns one row.
2. Change your query to use one of the following functions against your subquery results:
* ANY
* ALL
* IN
* NOT IN


For example, if you tried to execute the following SQL statement:

Selecionar tudo

    select * from orders
    where supplier_id = 	(select supplier_id
    	 from suppliers
    	 where supplier_name = 'IBM');

And there was more than one record in the suppliers table with the supplier_name of IBM, you would receive the following message:

Imagem

The most common way to correct this SQL statement is to use the IN function as follows:

Selecionar tudo

    select * from orders
    where supplier_id IN 	(select supplier_id
    	 from suppliers
    	 where supplier_name = 'IBM');
fonte
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D


PL/SQL : How to update using select

This "problem" came across me when I needed to update an entire temporary table column. One option is to loop all table rows, boring and time consumer task. After some background searchs I'vê adopted this method:

Selecionar tudo

UPDATE TABLEA SET
(TABLEA.COLUMNA, TABLEA.COLUMNB) =
(SELECT TABLEB.COLUMNA, TABLEB.COLUMNB FROM TABLEB WHERE TABLEB.ID = TABLEA.ID)
I'vê basically do one inner select and join the two tables in the inner select's WHERE clause.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Esta ocorrendo que sua tabela VENDAS possui mais de um registro e não possui nenhum where na subquery.

Para solucionar você deve reescrever de forma que a subquery só retorno um registro.

Caso o resultado esperado seja uma alteração em todas as linhas da tabela VENDAS você pode fazer assim:

Selecionar tudo

UPDATE vendas v1 SET unidades =(
SELECT
NVL(vend1,0)+NVL(vend2,0)+NVL(vend3,0)+NVL(vend4,0)+NVL(vend5,0)+NVL(vend6,0)+NVL(vend7,0)+NVL(vend8,0)
FROM
vendas v2 where v2.PK = v1.PK);
Onde os campos PK que eu coloquei seriam as colunas da tua PK.
zedd
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 11 Ago 2010 2:20 pm
Localização: Bahia

Obrigado pela atenção de todos que postaram mas analisando com mais calma detectei onde estava o problema, diante do resultado que esperava, e então vi o que eu estava fazendo de errado.

Na verdade eu não precisava fazer uma subconsulta, já que queria o somatório de colunas que continham valores, era apenas necessário fazer um update comum.

Viajei legal e passei por cima do solução sem necessidade. Segue correção

Selecionar tudo

update vendatsamb SET und = (
             NVL(vend1,0)
             +NVL(vend2,0)
             +NVL(vend3,0)
             +NVL(vend4,0)
             +NVL(vend5,0)
             +NVL(vend6,0)
             +NVL(vend7,0)
             +NVL(vend8,0))
SIMPLES ASSIM :-o

Obrigado pela cooperação de todos :D
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes