Amigo,
O problema não está na sua função e sim na forma que vc está chamando a mesma,
não sei como vc está chamando a mesma mas funções que executam operações DDL,
COMMIT ou ROLLBACK no BD não podem ser chamadas dentro de uma query.
Ex:
select fc_limpeza_base_dados_srta(9999)
from dual;
No caso acima vai gerar o erro. Segue abaixo alguns exemplos que podem te
ajudar:
1º Ex
DECLARE
VAR NUMBER;
FUNCTION A
RETURN NUMBER
IS
BEGIN
ROLLBACK;
RETURN 1;
END;
BEGIN
SELECT A
INTO VAR --> Com esse comando dá o erro.
FROM DUAL;
VAR := A; -- Com esse funciona.
END;
2º Ex
CREATE FUNCTION A
RETURN NUMBER
IS
BEGIN
ROLLBACK;
RETURN 1;
END;
SELECT A
FROM DUAL; --> Aqui vc tambem consegue simular o erro.
Espero ter ajudado.
Roberto Valenza.
----- Mensagem original ----
De: Mÿffffe1rcio Vilariÿfffff1o <[EMAIL PROTECTED]>
Para: [email protected]
Enviadas: Quarta-feira, 8 de Novembro de 2006 10:28:53
Assunto: [oracle_br] Error ORA-14552 ao executar a Function
Bom Dia!!!!!
Estou tento executar o Function abaixo e está me apresentando o seguinte erro :
ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
Gostaria de saber o que está errado no codigo?
Desde já agredeço da todos..
CREATE OR REPLACE Function fc_limpeza_base_dados_srta(p_no_ano_mes_cmpt In
Number)
RETURN NUMBER IS
ERRO EXCEPTION;
V_CT_NO_ANO_MES_CMPT LOG_LIMPEZA_BASE_SRTA.NO_ANO_MES_CMPT%Type;
BEGIN
IF p_no_ano_mes_cmpt IS NULL Then
RAISE ERRO;
ELSE
select NO_ANO_MES_CMPT Into V_CT_NO_ANO_MES_CMPT
from LOG_LIMPEZA_BASE_SRTA
where NO_ANO_MES_CMPT = p_no_ano_mes_cmpt;
IF V_CT_NO_ANO_MES_CMPT IS NOT NULL THEN
RAISE ERRO;
END IF;
END IF;
delete from PEDIDO_PRODUTOS_SUPRIMENTOS where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from PEDIDO_PRODUTOS_SUPRIMENTOS where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from HISTORICO_PRECO_MEDIO_REAL where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from HIST_PRECO_MEDIO_REFERENCIA where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from ESTIMATIVA_TRANSFERENCIA_ALC where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from ESTIMATIVA_ALOCACAO_ALCOOL where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from FORNECEDOR_ALCOOL_PRECO_REF where NO_ANO_MES_CMPT =
p_no_ano_mes_cmpt;
delete from TRANSFERENCIA_ALCOOL where NO_ANO_MES_CMPT = p_no_ano_mes_cmpt;
delete from ALOCACAO_ALCOOL where NO_ANO_MES_CMPT = p_no_ano_mes_cmpt;
delete from COMPRA_ALCOOL where NO_ANO_MES_CMPT = p_no_ano_mes_cmpt;
COMMIT;
-- PROCESSAMENTO TERMINOU COM SUCESSO
insert into log_processamento
(CD_USUARIO, DT_PROC , TIMESTAMP_PROC , CD_PGM , NO_SEQ, TP_OPER, DS_MSG)
values
('PRODUCAO', current_timestamp, current_timestamp, 'LIMPEZA_SRTA', 1, 'E',
'TERMINO NORMAL' );
COMMIT;
RETURN 1;
EXCEPTION
WHEN ERRO then
ROLLBACK;
-- NÃO PASSOU NA VERIFICAÇÃO DA COMPETENCIA
insert into log_processamento
(CD_USUARIO, DT_PROC , TIMESTAMP_PROC , CD_PGM , NO_SEQ, TP_OPER,
DS_MSG)
values
('PRODUCAO', current_timestamp, current_timestamp, 'LIMPEZA_SRTA', 1,
'E', 'TERMINO ANORMAL' );
COMMIT;
RETURN 0;
WHEN OTHERS Then
ROLLBACK;
-- HOUVE FALHA DURANTE O PROCESSAMENTO
insert into log_processamento
(CD_USUARIO, DT_PROC , TIMESTAMP_PROC , CD_PGM , NO_SEQ, TP_OPER,
DS_MSG)
values
('PRODUCAO', current_timestamp, current_timestamp, 'LIMPEZA_SRTA', 1,
'E', 'TERMINO ANORMAL' );
COMMIT;
RETURN 0;
END fc_limpeza_base_dados_srta;
/
_______________________________________________________
Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu celular.
Registre seu aparelho agora!
http://br.mobile.yahoo.com/mailalertas/
[As partes desta mensagem que não continham texto foram removidas]
_______________________________________________________
Yahoo! Acesso Grátis - Internet rápida e grátis. Instale
o discador agora!
http://br.acesso.yahoo.com
[As partes desta mensagem que não continham texto foram removidas]
Sábado Agora: ENPO-BR 2006 - Encontro Nacional de Profissionais Oracle
VISITE: http://www.enpo-br.org/ - Dia 11/11 "Vagas Limitadas"
________________________________________________________________
Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine
--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/[email protected]/
--------------------------------------------------------------------------------------------------------------------------
O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/
------------------------------------------------------------------------------------------------------------------------
Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/
<*> Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html