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
  

Mensagemem Sex, 27 Ago 2010 2:47 pm

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 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:

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:
zedd
Localização: Bahia

Mensagemem Sex, 27 Ago 2010 2:51 pm

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:

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:

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


fonte
victorhugomuniz
Localização: Rio de Janeiro - RJ

Jesus está voltando, volte antes para Ele.

Imagem JavaBlackBelt

Mensagemem Sex, 27 Ago 2010 2:54 pm


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:

Código: Selecionar todos
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.
victorhugomuniz
Localização: Rio de Janeiro - RJ

Jesus está voltando, volte antes para Ele.

Imagem JavaBlackBelt

Mensagemem Sex, 27 Ago 2010 3:33 pm

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:

Código: Selecionar todos
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.
gfkauer
Localização: Sapiranga - RS

Quem falou que programar era fácil??

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

Acessem: www.gfkauer.com.br

Mensagemem Sex, 27 Ago 2010 4:37 pm

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
Código: Selecionar todos
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
zedd
Localização: Bahia


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


    Voltar para SQL

    Quem está online

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