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.
Popularity: 8% [?]
RSS Feed
Twitter
February 19th, 2010
Meison Almeida
Posted in 




Abraço!
Abraços
Você pode me passar a query que está com dificuldade? Provavelmente você terá que fazer join ao invés de um select onde deve-se trazer somente uma linha. O report eu não sei muitos detalhes, mas se for para colocar duas linhas você faz um join e deixa em um select só, senão você terá que fazer dois selects para trazer os funcionarios.
aux varchar2(240);
begin
SELECT DISTINCT p.nm_pessoafisica into aux
from pessoa_fisica p, triagem t
where p.cd_pessoafisica = t.cd_pftriagem;
return aux;
end;
seria isso ai.
for v in (select usuario from usuarios)
loop
dbms_output.put_line(v.usuario);
for x in (select atualizacao from usuarios_atualizacao where usuario = v.usuario)
loop
dbms_output.put_line(x.atualizacao);
end loop;
end loop;
Agora se você quer somente uma quantidade de atualizações pode ser em uma query só tipo:
select usuario, (select count(1) from usuarios_atualizacao where usuario=v.usuario) from usuario v;
Isso já te ajuda?
NOme da pessoa e seu dados. CErto, sem repetições
Dados de compras. Esta aparecendo: Compra 1, compra 1, compra 1, compra 2, compra 2, compra 2, compra 3, compra 3, compra 3. E as datas estão repetindo. Porem já fiz join.
select distinct campo1, campo2, campo3
from ….
O distinct te fará trazer só os dados sem repetição.
O problema era em uma tabela que não tinha nada haver com sql. Obrigada