ROWNUM em Function pegando valor 0

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Olá Pessoal estou com uma duvida.
Queria saber como faço para rodar esta funçao e pegar o caso de não ter registro para o parametro que eu passo.
Ela está compilando sem problemas porém quando testo dá o erro
SQL Error: ORA-20001: An error was encountered - 100 -ERROR- ORA-01403: dados não encontrados
ORA-06512: em "LOGIX.CGS_CADASTRA_CARTAS_COBRANCA", line 29
Testei colocar nvl() mas mesmo assim não está dando certo.

Selecionar tudo

create or replace FUNCTION "CGS_CADASTRA_CARTAS_COBRANCA"
(
p_docum IN char
)
RETURN NUMBER IS

    vQtdReg number;
    vTipCart number;    
    vData   date;
BEGIN 
SELECT nvl(ROWNUM,0) INTO vQtdReg FROM cgs_controle_cartas_cobranca  WHERE trim(docum) = p_docum;
  
  
  IF (vQtdReg = 0) THEN
    INSERT INTO cgs_controle_cartas_cobranca (docum, data_envio, tipo_carta) VALUES(p_docum, SYSDATE,'1');
    vTipCart := 1;
  END IF;
  IF (vQtdReg = 1)  THEN
    SELECT data_envio INTO vData FROM cgs_controle_cartas_cobranca  WHERE trim(docum) = p_docum;
    IF (SYSDATE - vdata > 7 ) THEN    
      INSERT INTO cgs_controle_cartas_cobranca (docum, data_envio, tipo_carta) VALUES(p_docum, SYSDATE,'2');
      vTipCart := 2;
    END IF;
  END IF;
  COMMIT;
  RETURN vTipCart;
EXCEPTION
  WHEN OTHERS THEN
      raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, bl?


Cara, antes do teu WHEN OTHERS, trata um WHEN NO_DATA_FOUND:

Selecionar tudo

  WHEN NO_DATA_FOUND THEN 
    dbms_output.put_line('Sem registro. ');
  WHEN OTHERS THEN
qualquer coisa, manda ai.
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

falha minha...
BURROBURROBURRO

esqueci da exceção WHEN no_data_found

foi mal pessoal =p
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Vlw cara... me liguei depois.... :oops:
Abraços ai
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Que funçãozinha didática...

Após tratar a exceção dá o novo erro...

14551. 00000 - "cannot perform a DML operation inside a query "
*Cause: DML operation like insert, update, delete or select-for-update
cannot be performed inside a query or under a PDML slave.
*Action: Ensure that the offending DML operation is not performed or
use an autonomous transaction to perform the DML operation within
the query or PDML slave.
estou chamando a função através de um select

select funcao from dual por exemplo...
Como estou usando php usei essa funcao para evitar encher de código de inserts,talvez não tenha sido boa a idéia =(
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Não se pode usar DML em functions, neste caso use uma procedure, se necesário retornar algo, declare um parametro como sendo OUT,
Responder
  • Informação