测试的时候我输入的参数:col_name(列名) :V11012
sta(numberx型):50136
date_now(varchar2型): 2007-10-4 
就是这个date_now因为是动态的,还需要加单引号,所以被转义字符弄晕了,谢谢 帮我看看怎么改啊!create or replace function fun_T_mete_realtime_ave(sta in t_Mete_Realtime.V12004%TYPE,
col_name in varchar2,date_now in varchar2) return number is
  Result_ave number;
  temp_var varchar2 (200);
begin
  
  temp_var:='select   avg('||col_name||') as Result_ave 
      FROM   T_mete_realtime 
   where  IIIII='|| sta ||' and  
   VYEAR=to_number(to_char(to_date('''||date_now||''',''yyyy-mm-dd''),''yyyymm'')) and
    VDAY=to_number(to_char(to_date('''||date_now||''',''yyyy-mm-dd''),''dd''))';  
  dbms_output.put_line(temp_var);  
  EXECUTE   IMMEDIATE   temp_var into Result_ave ;  
  return Result_ave;
   
  
end fun_T_mete_realtime_ave;

解决方案 »

  1.   

    我发现很奇怪,最后2个任意1个是好的,2个一起就出错。
    现在发现问题了。
    temp_var varchar2 (200);  -》 temp_var varchar2 (1000);  长度不够,你写的是对的
      

  2.   

    date_now是varchar2
    格式应该也是固定,那就不需要你这么复杂,转来转去的
    直接用substr不就行了
    substr(date_now,1,4)||substr(date_now,6,2)='200710'
    substr(date_now,9,2)='4'
    你可以在temp_var拼接前,先写好两个变量
    比如t_vyear
    t_vday  都是varchar
    然后这样
    temp_var:='select   avg(' ¦ ¦col_name ¦ ¦') as Result_ave  
          FROM   T_mete_realtime  
       where  IIIII=' ¦ ¦ sta  ¦ ¦' and   
       VYEAR='||t_vyear|' and   VDAY='||t_vday;   
      

  3.   

    格式不是固定的,比如2007-10-4 与 2007-1-4
    10月份就多占一位了
    多谢大家,HelloWorld_001 说的对,200长度少了,定1000就通过了,谢谢!