- Este tópico contém 4 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 4 meses atrás por
Roldao.
-
AutorPosts
-
6 de agosto de 2009 às 4:33 am #88616
Roldao
ParticipanteOlá a todos, Galera fiz um cursor basico do basico que segue abaixo, só para demonstração
declare
cursor c_visualizar is
select a.nome_mercado,c.nome_produto,c.genero
from tb_mercado a,
tb_produto_mercado b,
tb_produto c
where a.id_mercado = b.id_mercado
and c.id_produto = b.id_produtoorder by nome_mercado;
v_linha c_visualizar%rowtype;
begin
open c_visualizar;
loop
fetch c_visualizar into v_linha;
exit when c_visualizar%notfound;dbms_output.put_line(”);
dbms_output.put_line (‘Mercado: ‘ || v_linha.nome_mercado);
dbms_output.put_line (‘Produto: ‘ || v_linha.nome_produto);
dbms_output.put_line (‘Genero: ‘ || v_linha.genero);end loop;
close c_visualizar;
end;MINHA DUVIDA SÃO OS EXCEPTION, POIS CONHECE SÓ
WHEN DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20001,’mENSAGEM’||SQLERRM);E
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20001,’mENSAGEM’||SQLERRM);
GOSTARIA QUE ME EXPLICASSE SOBRE OS TRATAMENTOS DE ERRO, ESTOU COM MUITAS DÚVIDAS, E GOSTARIA DE TRABALHAR EM CIMA DELES.
gRATO
6 de agosto de 2009 às 3:45 pm #88621jspaulonci
ParticipanteRoldao, dá uma olhada nesse site, tem alguns exemplos de exceptions
http://www.psoug.org/reference/exception_handling.html
abraços
spaulonci6 de agosto de 2009 às 3:48 pm #88622ramasine
ParticipanteAmigo,
Toda exceção do oracle vem acompanhada do código do erro, no formato ORA-12345, existem muitos erros que podem ser levantados pelo Oracle, e portanto, como vc não irá fazer tratamento para todos eles é sempre bom ter uma cláusula “WHEN OTHERS THEN” no seu tratamento de exceção.
O Oracle também já disponibiliza algumas exceções pré-definidas que são as que comumente acontecem e vc pode utilizá-las para fazer um tratamento específico enviando uma mensagem mais amigável ao usuário, um exemplo delas seria NO_DATA_FOUND,DUP_VAL_ON_INDEX,
TOO_MANY_ROWS entre outras. Um exemplo de utilização delas seria:begin
–seu código
exception
when NO_DATA_FOUND then
RAISE_APPLICATION_ERROR(-20000, ‘INFORMAÇÃO NÃO ENCONTRADA’);
when others then
–tratamento geral
end;É sempre bom utilizar OTHERS como um tratamento geral para vc garantir que todas as exceções serão tratadas. Observe que no tratamento da exceção pré-definida NO_DATA_FOUND eu levantei uma exceção personalizada com a mensagem própria.
Para personalizar ainda mais vc também pode utilizar a função
PRAGMA_EXCEPTION_INIT que vc associa um SQLCODE (não é um ORACODE – ORA 12345) já existente à uma variável EXCEPTION. Para isso vou dar um exemplo:DECLARE
E EXCEPTION;
PRAGMA_EXCEPTION_INIT(E, -1031);
–ASSOCIEI A VARIAVEL EXCEPTION AO SQLCODE -1031 CUJO ORACODE É
–ORA-01031
BEGIN
–CÓDIGO
EXCEPTION
WHEN E THEN
–FAÇA O SEU TRATAMENTO
WHEN OTHERS THEN
— TRATAMENTO GERAL
END;Alem de associar variáveis EXCEPTION à SQLCODEs existentes vc pode também utilizar essas variáveis para criar exceções dentro do código:
DECLARE
E EXCEPTION;
BEGIN
IF (alguma condição pra levantar exceção – ex: regra de negocio não
permitida) THEN
RAISE E;
END IF;
EXCEPTION
WHEN E THEN
— FAÇA SEU TRATAMENTO
WHEN OTHERS THEN-- TRATAMENTO GERALEND;
Como podes ver, existem muitas formas de fazer esse tratamento personalizado. Para consultar os códigos de erros do oracle existem muitos sites, um deles é http://www.ora-code.com!!
No link abaixo vc consegue ver a tabela de Predefined PL/SQL exceptions!
http://www.ciin.com.br/danielaccorsi/wp … tsheet.jpg
6 de agosto de 2009 às 4:04 pm #88624Leonardo Litz
ParticipanteOlá Ronaldo,
Existem varios tratamentos de erros no oracle.
Existem por exemplo tratamentos pré determinados pelo oracle e outros que podemos determinar.Alguns pré determinados, os mais comuns:
NO_DATA_FOUND -> quando não se encontra um dado, ou select não retorna ou um array não contem dado.
TOO_MANY_ROWS -> um select retorna mais que uma linha.
DUP_VAL_ON_INDEX -> quando em um insert ou update ocorre restrição de chave primaria.
INVALID_NUMBER -> quando não é um número valido, esta tentando inserir um caracter em uma variavel/coluna numerica.
ZERO_DIVIDE -> quando algum número esta sendo dividido por zero.
COLLECTION_IS_NULL -> quando alguma coleção esta nula.Dentre outros.
Você também pode determinar os erros da seguinte forma, por exemplo:
Quero que se ocorrer um erro, onde o pai de um registro não existir, mostre uma mensagem:
Crie as tabelas.
create table teste1 (id_teste1 number(2) primary key);
create table teste2 (id_teste2 number(2) primary key,
id_teste1 number(2));alter table teste2 add constraint fk_teste1 foreign key (id_teste1) references teste1(id_teste1);
Execute o script de teste.
declareparent_key_not_found exception;
pragma exception_init(parent_key_not_found,-02291);begin
insert into teste2(id_teste2,id_teste1) values (1,1);
exception when parent_key_not_found then
dbms_output.put_line('Erro de chave estrangeira!');
end;
Desta forma você pode montar vários excepitons customizados.
Vlw Leonardo Litz
7 de agosto de 2009 às 1:56 am #88686Roldao
ParticipanteValew Galera, Obrigado mesmo..
-
AutorPosts
- Você deve fazer login para responder a este tópico.