Desenvolvi uma função que busca em uma entidade de histórico de tabela de preço o preço vigente, de acordo com a data base informada. Até ai ok.
O problema que passo como parâmetro o nome do campo que o select da função irá utilziar para retornar, pois posso pedir PREÇO, PREÇO_PROMOCIONAL e PREÇO_MINIMO. Cada um desses 3 preços constituem um campo da entidade de tabela de preço.
O problema é que quando vou executar a função (visto que ela compilou com sucesso) me retornar um erro de que a função esperava tipo de dado DATE e foi informado NUMBER. Ou seja, o parametro de data_base informado (do tipo date) está recebendo por parametro um tipo de dado NUMBER. Mas estou passando uma data como parametro.
Poderiam me ajudar a encontrar o problema? Ressalto que para executar a função, estou utilizando o TEST da ferramenta PL/SQL Developer, garantindo assim que passo uma data como parametro.
Código abaixo:
CREATE O REPLACE FUNCTION KALVEN.F_RETORNA_PARAMETRO
( PRO_IN INTEGER,
PRO_PAD INTEGER,
PRO_TAB INTEGER,
TPR_IN INTEGER,
TPP_IN INTEGER,
TPR_PAD INTEGER,
TPR_TAB INTEGER,
PDATA DATE,
CAMPO VARCHAR2
)
RETURN NUMBER
IS
vPrec Number;
vSql varchar2(500);
begin
vSql := 'select ' || CAMPO || ' from kalven.ven_preço_temp pre where pre.pro_in_codigo = ' || PRO_IN ||
' and pre.pro_pad_in_codigo = ' || pro_pad ||
' and pre.pro_tab_in_codigo = ' || pro_tab ||
' and pre.tpr_in_codigo = ' || tpr_in ||
' and pre.tpp_in_codigo = ' || tpp_in ||
' and pre.tpr_pad_in_codigo = ' || tpr_pad ||
' and pre.tpr_tab_in_codigo = ' || tpr_tab ||
' and pre.data_inclusao <= ' || pdata ||
' and pre.rownum = 1 order by pre.data_inclusao desc';
execute immediate vSql into vPrec;
return (vPrec);
end;
Sei que posso utilizar o case e não utilziar o execute immediate, mas seria minha ultima solução, visto que , se mudar o nome do campo ou entrar um novo preço, terei que realizar uma manutenção na função.
abraços.
Daniel Barros