Lomadee, uma nova espécie na web. A maior plataforma de afiliados da América Latina.

segunda-feira, 12 de dezembro de 2011

Como resolver o erro ORA-01422

O erro oracle, em código PL-SQL, ORA-01422: exact fetch returns more than request number of rows, é retornado quando em uma única váriavel é tentado retornar mais de um valor, para acertar isso há várias formas dependendo da sua necessidade, vamos a alguns casos: 1 – Query não deve retornar mais de um registro
Vamos a uma situação hipotética, temos uma tabela de pedidos e uma tabela de clientes e queremos pegar um número de pedido dele, para isso usamos a seguinte query:
select id_pedido
into vID_Pedido
from pedido p, cliente c
where c.nome = 'MEISON'
and c.id_cliente = p.id_cliente;

Se o cliente tiver feito somente um pedido, essa query retornará só uma linha, mas se ele já for um cliente que está pedindo pela segunda ou mais vez será retornado mais de uma linha o que retornará o erro em questão, pois tentará jogar para a variavel vID_Pedido mais de um valor, o que não é possível. Para corrigir se a regra permitir é só pegar uma linha, por exemplo o ultimo pedido, ficando dessa forma:
select id_pedido
into vID_Pedido
from pedido p, cliente c
where c.nome = 'MEISON'
and c.id_cliente = p.id_cliente
and rownum=1
order by id_pedido desc;

O rownum=1 restringe a só uma linha, mas lembrando que sem o order by, ele pega a primeira linha que trouxer do banco. O order by irá garantir que seja a ultima linha criada.
2 – Query pode retornar mais de um registro
Tendo como base o primeiro exemplo, porém precisando pegar todos os pedidos desse cliente, o que deve ser feito é tratar cada um deles individualmente, eu utilizaria o loop, ficando assim:
for vAux in (select id_pedido from pedido where id_cliente = 1)
loop
--Procedimento para tratar vAux.id_pedido
end loop;

Dessa forma não é dado o erro ORA-01422 e trata-se da maneira certa cada um dos pedidos.
3 – Query não deve retornar mais de uma linha, erro de cadastro
Isso é causado quando o sistema deveria inserir somente uma linha e por algum erro, inseriu mais de uma, provocando um erro conceitual. É claro que nesse caso deve-se corrigir a origem que é a inserção erronea de mais de uma linha, mas pode-se tratar também no destino, vamos utilizar a mesma query, ela deveria tratar os erros e ficaria dessa forma:
begin
select id_pedido
into vID_pedido
from pedido
where id_cliente = 1;
exception
when too_many_rows then
raise_application_error(-20000,'Erro na tabela pedido, mais linhas para o cliente do que permitido.');
end;

Dessa forma abordamos alguns cenários que podemos sanar esse problema. Caso você tenha algum outro problema, comente poderemos fazer outro artigo para solucionar seu problema.

fonte: http://www.meison.com.br/2010/02/19/como-resolver-o-erro-ora-01422/

Nenhum comentário:

Postar um comentário

Related Posts Plugin for WordPress, Blogger...