Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kaolapso

Cursor Vazio

Recommended Posts

Pessoal, tenho uma procedure que retorna um cursor, porem surgiu a necessidade de não se permitir que o cursor retorne vazio. Vou postar o código da minha proc aqui e se puderem me ajudar a resolver este problema, agradeço.

PROCEDURE PRC_RETORNA_CURSOR (
            COD_ENTRADA IN NUMBER,               
            PCURSOR OUT cursor_type)
IS

BEGIN

-- SELECT 
OPEN   PCURSOR FOR 
SELECT CAMPOA, CAMPOB, CAMPOC
FROM   TABELA 
WHERE  COD_TABELA = COD_ENTRADA;

END PRC_RETORNA_CURSOR;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente algo assim

 

PROCEDURE PRC_RETORNA_CURSOR (
            COD_ENTRADA IN NUMBER,               
            PCURSOR OUT cursor_type)
IS

vn_qtd number;

BEGIN

SELECT count(*) 
into   vn_qtd
FROM   TABELA 
WHERE  COD_TABELA = COD_ENTRADA;

if vn_qtd = 0 then
 raise_application_error(-20001,'Select retornando sem dados !!!');
end if;

-- SELECT 
OPEN   PCURSOR FOR 
SELECT CAMPOA, CAMPOB, CAMPOC
FROM   TABELA 
WHERE  COD_TABELA = COD_ENTRADA;

END PRC_RETORNA_CURSOR;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Motta, pensei em fazer algo desse tipo, inclusive em algumas procs já estou fazendo, o problema é pode ter alguma tabela no meu escopo que contenha muitos registros, e se fizer isso, estaria executando o select duas vezes, sacrificando a performance. Será que existe alguma outra forma, tipo utilizando WHEN_NOT_EXISTS, ou algo do genero?

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato, a execução seria 2 vezes.

 

Não pois o erro terá de ser tratado na rotina que abrisse.

 

Mas em todo caso tente

 

PROCEDURE PRC_RETORNA_CURSOR (
            COD_ENTRADA IN NUMBER,               
            PCURSOR OUT cursor_type)
IS

BEGIN

-- SELECT 
OPEN   PCURSOR FOR 
SELECT CAMPOA, CAMPOB, CAMPOC
FROM   TABELA 
WHERE  COD_TABELA = COD_ENTRADA;

EXCEPTION
 WHEN NO_DATA_FOUND THEN
   raise_application_error(-20001,'Select retornando sem dados !!!');

END PRC_RETORNA_CURSOR;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei da forma que você mencionou mas não funciona. Ele apenas funciona quando eu troco o cursor por um "Select INTO variavel". Caso contrário, ele não entra na Exception. Caramba!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o esperado, a exceção deve ser tratada no objeto que chama o cursor, ou fazendo um teste antes.

 

Se pensar outra solução posto aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.