请教一个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;
--最好是类型统一