检查周休息日比插入周休息日其他存在但只得到例外

Checks day where week rest than insert week rest else present but get only exception

检查星期休息的日子,而不是插入星期休息,其他情况存在,但只有在我做错的地方出现异常请它从员工表中获取数据,其中星期休息为 1,2.. 然后我用天名称转换并比较我的约会对象是:ATT_DATE 我能做些什么

function CF_WEEKRESTFormula return CHAR is
v_rest     number;
v_rest_day varchar2(3);
A VARCHAR2(40);
B VARCHAR2(40);
begin
  select week_rest into v_rest from EMPLOYEES
  where employee_id1=:employee_id1
  and :att_date between :date1 and :date2;
  if v_rest=1 then
    v_rest_day:='SUNDAY';
  elsif v_rest=2 then
    v_rest_day:='MONDAY';
  elsif v_rest=3 then
    v_rest_day:='TUESDAY';
  elsif v_rest=4 then
    v_rest_day:='WEDNESDAY';
  elsif v_rest=5 then
    v_rest_day:='THURSDAY';
  elsif v_rest=6 then
    v_rest_day:='FRIDAY';
  elsif v_rest=7 then
    v_rest_day:='SATURDAY';
  end if;
  select RTRIM(to_char(:ATT_DATE,'DAY')) into a from dual;
    IF A = v_rest_daY  
        THEN B := 'WEEK REST';
    ELSE B := 'PRESENT';
        END IF;
    return B;
 -- return v_rest_day;
exception
  when others then
    return 'AAA';
end;

它只是 return 个例外

永远不要捕获 OTHERS 异常。它向您隐藏了所有错误消息,使您无法轻松调试问题。

您似乎将所有内容都转换为字符串,而将所有内容都保留为数字会容易得多。没有最小的代表性示例,很难检查代码,但您似乎想要:

FUNCTION CF_WEEKRESTFormula
RETURN CHAR
IS
  v_rest     number;
BEGIN
  SELECT week_rest
  INTO   v_rest
  FROM   EMPLOYEES
  WHERE  employee_id1=:employee_id1
  AND    :ATT_DATE between :DATE1 and :DATE2;

  IF TO_CHAR( :ATT_DATE, 'D' ) = v_rest THEN
    RETURN 'WEEK_REST';
  ELSE
    RETURN 'PRESENT';
  END IF;
END;

现在,错误可能是 TOO_MANY_ROWS 异常,而您的 SELECT 语句是 returning 多行,而只需要一个值;但是,我们无法判断,因为:您没有发布错误;并且错误隐藏在捕获 OTHERS 异常的背后(我是否提到过你不应该捕获它)。如果是这种情况,您将需要计算出您希望在日期范围内 return 哪个值;这不是我们可以帮助您的事情,因为 (a) 我们没有您的数据,并且 (b) 这是一个关于如何实现您 return 的价值的业务决策,我们无法做到这一点为你决定。

或者,可能是出现了NO_DATA_FOUND异常。同样,您需要就如何处理此问题做出业务决策,但您可以使用类似的方法:

FUNCTION CF_WEEKRESTFormula
RETURN CHAR
IS
  v_rest     number;
BEGIN
  SELECT week_rest
  INTO   v_rest
  FROM   EMPLOYEES
  WHERE  employee_id1=:employee_id1
  AND    :ATT_DATE between :DATE1 and :DATE2;

  IF TO_CHAR( :ATT_DATE, 'D' ) = v_rest THEN
    RETURN 'WEEK_REST';
  ELSE
    RETURN 'PRESENT';
  END IF;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN 'ERROR - NO DATA';
  WHEN TOO_MANY_ROWS THEN
    RETURN 'ERROR - TOO MUCH DATA';
END;