Ir para conteúdo

POWERED BY:

Arquivado

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

MrEd

Function

Recommended Posts

Pessoal, tem exatamente 5 dias que eu comecei a usar pl/sql. Aqui no trampo estamos desenvolvendo um sistema em php e algumas funções serão executadas pelo oracle. Entao eu escrvi a seguinte função:

create or replace FUNCTION LUZ ( item IN NUMBER, descricao IN VARCHAR2, qtd IN NUMBER, hrsUso IN NUMBER, freq IN NUMBER, pot IN NUMBER, vlr IN NUMBER, codCC IN NUMBER) RETURN VARCHAR2 AS	calculo NUMBER := null;	vlrItem NUMBER := null;	erro	EXCEPTION;BEGIN		if freq = 1 then		vlrItem := 30;	elsif freq = 2 then		vlrItem := 4;	elsif freq = 3 then		vlrItem := 1;	else		RAISE erro;	end if;		calculo := (qtd * hrsUso * vlrItem * pot) / 1000;		if calculo <> 0 then			INSERT INTO EN_CC(EN_CC_CC_OM,ITEM,DESCRICAO,QTDE,HORAS_USO,FREQUENCIA,POTENCIA,VALOR,DATA_INCTMS_ULT_ALTERACAO)			   VALUES(codCC,item,descricao,qtd,hrsUso,freq,pot,vlr,SYSDATE,SYSTIMESTAMP);		end if;		EXCEPTION		WHEN erro then			return 'Valor inválido para frequência.';		return calculo;END LUZ;
Quando eu passo os parametros pelo php, na linha do insert ele me retorna o seguinte erro do oracle: Erro: ORA-14551: cannot perform a DML operation inside a query ORA-06512: at "SIGA_DESENVOLVIMENTO.LUZ", line 23

 

Como eu posso evitar/corrigir este erro?

 

Grato,

Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,acredito que o erro, apesar de eu nunca tê-lo visto, é bem claro. Você *NÃO* pode utilizar comandos DML ( INSERT, UPDATE e DELETE) dentro de instruções SELECT.Provavelmente, você está chamando essa sua FUNCTION dentro de um SELECT, certo? Acho que esse é o problema.Se é necessário pela regra de negócio da aplicação, realizar esse INSERT quando você selecionar dados dessa tabela, acho que você deverá usar STORED PROCEDURE.Até!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo, isto funciona ?

 

O Oracle não vê que ocorre um insert dentro do select.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu mudei ela pra procedure, vamos ver se vai funcionar. Qualquer coisa vou tentar a solução citada pelo rodrigo.[]'s

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.