检查周休息比插入周休息的日期,但只得到例外



检查周休息的日子,而不是插入周休息,但只有例外,我做错了,请从员工表中获取数据,其中周休息与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;

它只是返回异常

永远不要捕获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语句返回多行时,只有一个值是预期的;但是,我们不能告诉你,因为:你还没有发布错误;错误被隐藏在捕获OTHERS异常之后(我提到过你不应该捕获它)。如果是这种情况,您需要确定要在日期范围之间返回哪个值;这不是我们可以帮助你的事情,因为(a)我们没有你的数据,(b)这是一个关于如何实现你返回的几个值的业务决策,我们不能为你做这个决定。

或者,可能存在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;

最新更新