请教一个function 传参的问题我建了一个functioncreate or replace FUNCTION rptsp_datediff
(
  p_interval  VARCHAR2,
  p_date1     DATE,
  p_date2     DATE
)
RETURN NUMBER
AS
  result      NUMBER;
  interval1    VARCHAR2(20) := UPPER(p_interval);
  date1       DATE := p_date1;
  date2       DATE := p_date2;
  
BEGIN
    dbms_output.put_line('****date1 '||to_char(date1,'yyyy-mm-dd HH24:mi:ss'));
    dbms_output.put_line('****date2 '||to_char(date2,'yyyy-mm-dd HH24:mi:ss'));
    dbms_output.put_line('****interval '||interval1);
    If  (interval1 = 'S') OR (interval1 = 'SS') OR (interval1 = 'SECOND') THEN
      result := round((date2-date1) * 24.0 *60.0 * 60.0);
      dbms_output.put_line('-----****------');
    END IF;    RETURN result;
end rptsp_datediff;
如果直接用sql 调用 没有问题
select    rptsp_datediff(
     'ss', to_date('2009-04-16 16:37:46', 'yyyy-mm-dd HH24:mi:ss'),
     to_date('2010-02-12 13:10:49', 'yyyy-mm-dd HH24:mi:ss')) as tt from dual;
但是 如果我声明参数后使用这个function 就根本不出结果
Declare
   end_date date;
   start_date date;
   out_put char(4);
   v_result number;
   
begin
  out_put :='ss';
  start_date :=to_date('2009-04-16 16:37:46', 'yyyy-mm-dd HH24:mi:ss');
  end_date :=to_date('2010-02-12 13:10:49', 'yyyy-mm-dd HH24:mi:ss');
  v_result :=rptsp_datediff(out_put, start_date, end_date);
  dbms_output.put_line('****v_result '||v_result);
  
End;
v_result为空 看起来这个 out_put 和 SS 不等  这是什么原因?

解决方案 »

  1.   

    out_put char(4);
    上面你声明的变量类型有问题,改成varchar2吧
    out_put := 'ss'
    由于是char4),所以变量的结果是'ss  '(后面有两空格)
    在函数里比较判断失败,所以v_result返回空
    当然你可以在函数里使用trim截去尾空格
      

  2.   

    --修改后
    --当然在使用dbms_output输入值前
    --请使用ser serveroutput on打开sqlplus输出
    DECLARE
      end_date   DATE;
      start_date DATE;
      out_put    VARCHAR2;
      v_result   NUMBER;
    BEGIN
      out_put    := 'ss';
      start_date := to_date('2009-04-16 16:37:46', 'yyyy-mm-dd HH24:mi:ss');
      end_date   := to_date('2010-02-12 13:10:49', 'yyyy-mm-dd HH24:mi:ss');
      v_result   := rptsp_datediff(out_put, start_date, end_date);
      dbms_output.put_line('****v_result ' || v_result);
    END;
    /
      

  3.   

    应该不关char的事,楼主的代码没问题,可能是没执行set serveroutput on,看不到结果
      

  4.   

    out_put char(4);
    char型为定长的字符串,长度不足自动以空格不齐,造成不等
      

  5.   


    Declare
      end_date date;
      start_date date;
      out_put varchar2(4);
      v_result number;
        
    begin
      out_put :='ss';
      start_date :=to_date('2009-04-16 16:37:46', 'yyyy-mm-dd HH24:mi:ss');
      end_date :=to_date('2010-02-12 13:10:49', 'yyyy-mm-dd HH24:mi:ss');
      v_result :=rptsp_datediff(out_put, start_date, end_date);
      dbms_output.put_line('****v_result '||v_result);
       
    End;--最好是类型统一