Função com EXECUTE IMMEDIATE

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
danielpbarros
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Dom, 15 Jan 2012 9:34 pm
Contato:
Daniel Barros

boa tarde pessoal, tudo bem?

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:

Selecionar tudo

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;
então, é informado o erro de tipo de dados apenas quando vou executar a função, ela compila com sucesso. Se eu comentar o parametro PDATA e comentar a linha "and pre.data_inclusao <= pdata" a função retorna ok. Porém preciso da data devido necessidade de preço posicional.

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
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Tenta passando a máscara pra data dinâmica:

Selecionar tudo

  vsql := vsql || ' where pre.data_inclusao <= to_Date('''||pdata||''', ''dd/mm/rrrr'') ';
danielpbarros
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Dom, 15 Jan 2012 9:34 pm
Contato:
Daniel Barros

então cara,

Deu certo sim colocando a mascara, porém tive que utiliza-la também no campo PRE.DATA_INCLUSAO.
Valeu pela ajuda e boa tarde aí.

Daniel.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes