MrEd 0 Denunciar post Postado Julho 20, 2007 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
oscarnogueira 1 Denunciar post Postado Julho 20, 2007 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
alphamek 2 Denunciar post Postado Julho 20, 2007 Rapaz,Coloque a sua instrução INSERT dentro do EXECUTE IMMEDIATE '<sua_instrução>'; e recompile novamente. Abraços, Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Julho 20, 2007 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
MrEd 0 Denunciar post Postado Julho 22, 2007 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