使用此函数获取编译错误

时间:2014-11-12 17:49:18

标签: oracle

我收到以下错误: 警告:编译但编译错误

当我尝试创建以下函数时:

Create or  replace function Time_Gap (v_date1, v_date2,  return varchar2 )
is   

difrence_In_Hours varchar2;
difrence_In_minutes varchar2;
difrence_In_seconds varchar2;

begin


      difrence_In_Hours := floor(((v_date2-v_date1)*24*60*60)/3600);
    difrence_In_minutes := floor((((v_date2-v_date1)*24*60*60) -
           floor(((v_date2-v_date1)*24*60*60)/3600)*3600)/60);
    difrence_In_seconds :=  round((((v_date2-v_date1)*24*60*60) -
           floor(((v_date2-v_date1)*24*60*60)/3600)*3600 -
           (floor((((v_date2-v_date1)*24*60*60) -
           floor(((v_date2-v_date1)*24*60*60)/3600)*3600)/60)*60) ));


    return   difrence_In_Hours   || '' HRS '' ||  difrence_In_minutes   || '' MINS '' ||    difrence_In_seconds
          || '' SECS '';


end ;
/

我做错了什么???

谢谢,

2 个答案:

答案 0 :(得分:1)

一些语法错误,返回类型应该在输入参数之外并定义输入类型:

create or replace function time_gap (v_date1 in date, v_date2 in date)
    return varchar2 is
    difrence_in_hours     varchar2(500);
    difrence_in_minutes   varchar2(500);
    difrence_in_seconds   varchar2(500);
begin
    difrence_in_hours := floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600);
    difrence_in_minutes :=
        floor ( ( ( (v_date2 - v_date1) * 24 * 60 * 60) - floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600) * 3600) / 60);
    difrence_in_seconds :=
        round (
            (  ( (v_date2 - v_date1) * 24 * 60 * 60)
             - floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600) * 3600
             - (  floor (
                        ( ( (v_date2 - v_date1) * 24 * 60 * 60) - floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600) * 3600)
                      / 60)
                * 60)));

    return difrence_in_hours || ' HRS ' || difrence_in_minutes || ' MINS ' || difrence_in_seconds || ' SECS';
end;
/

编辑:

您必须向我们提供更多错误消息。它没有说什么。这对我来说很好:

declare
    function time_gap (v_date1 in date, v_date2 in date)
        return varchar2 is
        difrence_in_hours     number;
        difrence_in_minutes   number;
        difrence_in_seconds   number;
    begin
        difrence_in_hours := floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600);
        difrence_in_minutes :=
            floor ( ( ( (v_date2 - v_date1) * 24 * 60 * 60) - floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600) * 3600) / 60);
        difrence_in_seconds :=
            round (
                (  ( (v_date2 - v_date1) * 24 * 60 * 60)
                 - floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600) * 3600
                 - (  floor (
                            (  ( (v_date2 - v_date1) * 24 * 60 * 60)
                             - floor ( ( (v_date2 - v_date1) * 24 * 60 * 60) / 3600) * 3600)
                          / 60)
                    * 60)));
        return trim (to_char (difrence_in_hours)) || ' HRS ' || trim (to_char (difrence_in_minutes)) || ' MINS ' || trim (
               to_char                                                                                                  (
               difrence_in_seconds)) || ' SECS';
    end;
begin
    dbms_output.put_line (time_gap (sysdate, sysdate - 2));
end;
==>
PL/SQL block executed
-48 HRS 0 MINS 0 SECS

答案 1 :(得分:0)

您是否在不检查语法的情况下创建了它?在做这样的事情之前,请务必检查语法。

根据https://docs.oracle.com/cd/B12037_01/server.101/b10759/create_function.gif仅在第一行:

  • 在每个参数
  • 中缺少[IN] [OUT] [IN OUT]之一
  • 您缺少每个参数的数据类型
  • return语句应在括号之外。

那时我停止了阅读。