日期:2014-05-17  浏览次数:20714 次

请教一个function 传参的问题
请教一个function 传参的问题

我建了一个function

create 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 不等 这是什么原因?

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

------解决方案--------------------
out_put char(4);
char型为定长的字符串,长度不足自动以空格不齐,造成不等
------解决方案--------------------
SQL code

Declare
  end_date date;
  start_date date;
  [color=#FF0000]out_put varchar2(4);[/color]
  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;





--最好是类型统一