检查周休息日比插入周休息日其他存在但只得到例外
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;
检查星期休息的日子,而不是插入星期休息,其他情况存在,但只有在我做错的地方出现异常请它从员工表中获取数据,其中星期休息为 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;