ORACLE - Problema com insert/update/delete dentro de function

2 respostas
A

Boa tarde,
Tenho uma função que executa um update em determinada tabela e retorna um valor. Para depurar, ela funciona normalmente retornando o valor e atualizando a outra tabela, porém não consigo chamar a mesma por um select.
OBS: o update necessariamente precisa estar dentro da função.

Sugestões?

2 Respostas

M

Você pode postar o código? :wink:

A
create or replace
function num RETURN NUMBER is
RESULT NUMBER;
                
  NUMDOC  NUMBER;
  ANO     NUMBER;
  DIGITO1 VARCHAR(1);
  DIGITO2 VARCHAR(1);

BEGIN
  SELECT TO_CHAR(SYSDATE, 'YYYY') INTO ANO FROM DUAL;

  SELECT NUMNDO INTO NUMDOC FROM TIQW.TIQNDO WHERE ANONDO = ANO AND TIPNDO = 'GD';
  NUMDOC := NUMDOC + 1; 
  
  
  UPDATE TIQW.TIQNDO     SET NUMNDO = NUMDOC   WHERE ANONDO = ANO      AND TIPNDO = 'GD';
   COMMIT ; 


  SELECT TO_CHAR(SYSDATE, 'YY') INTO ANO FROM DUAL;

  NUMDOC := NUMDOC || ANO;

  SELECT DIGITOMODULO11(to_char(NUMDOC)) INTO DIGITO1 FROM DUAL;

  NUMDOC := NUMDOC || DIGITO1;

  SELECT DIGITOMODULO11(to_char(NUMDOC)) INTO DIGITO2 FROM DUAL;

  NUMDOC := NUMDOC || DIGITO2;

  RESULT := NUMDOC;

  RETURN(RESULT);
END num;

O erro mostrado é o seguinte:
Erro ao iniciar na linha 1 no comando
select numdam() from dual
Relatório de erro:
Erro SQL: ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "TIQW.NUMDAM", line 16
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.

Quando eu executo a linha via sqldeveloper ela executa normalmente, retornando o valor. Contudo, preciso que este valor retorne em um select, o que não funciona.

Criado 27 de outubro de 2011
Ultima resposta 3 de nov. de 2011
Respostas 2
Participantes 2