我必须创建一个UDF作为作业的一部分。关于我们创建的内容,它是完全开放的,我选择创建一个函数,该函数可以计算给定STAFF_ID和WEEK_NUM时员工应得的总工资。
该功能的代码如下(原谅格式,我不确定格式化的正确方法):
CREATE OR REPLACE FUNCTION CALCULATE_WAGES(FSTAFFID IN NUMBER, FWEEKNUM IN NUMBER)
RETURN NUMBER
IS
WAGES NUMBER(6,3);
STAFF_ID NUMBER;
HOURS_WORKED NUMBER;
MAX_HOURS NUMBER;
HOURLY_RATE NUMBER;
OVERTIME_RATE NUMBER;
WEEK_NUM NUMBER;
CURSOR C1 IS
SELECT STAFF_ID, HOURS_WORKED, MAX_HOURS, HOURLY_RATE, OVERTIME_RATE, WEEK_NUM FROM STAFF_HOURS WHERE STAFF_ID = FSTAFFID AND WEEK_NUM = FWEEKNUM;
BEGIN
OPEN C1;
FETCH C1 INTO STAFF_ID, HOURS_WORKED, MAX_HOURS, HOURLY_RATE, OVERTIME_RATE, WEEK_NUM;
IF HOURS_WORKED > MAX_HOURS
THEN WAGES := (HOURLY_RATE * MAX_HOURS) + (HOURS_WORKED - MAX_HOURS) * OVERTIME_RATE;
ELSE WAGES := HOURLY_RATE * MAX_HOURS;
END IF;
CLOSE C1;
RETURN WAGES;
END;
当我在sqldeveloper中独自运行它时,该函数可以正常工作,如here所示。 Here是该表的数据类型。将弹出一个框,要求我输入参数,然后吐出返回值,这也是正确的。
Here is a screenshot用于STAFF_HOURS表。
因此,现在我的表中充满了测试数据,还有一个带有两个参数并吐出正确值的函数。
我现在遇到的问题是使用选择查询将该值输入到表中。到目前为止,我的情况是:
SELECT STAFF_ID, FIRST_NAME, LAST_NAME, HOURS_WORKED, MAX_HOURS, HOURLY_RATE, OVERTIME_RATE, WEEK_NUM, CALCULATE_WAGES(STAFF_ID, WEEK_NUM) AS "TOTAL DUE" FROM STAFF_HOURS;
我希望这样做是从表中选择所有行,然后最后在新行上添加等于该函数返回值的行。然后,这将显示每个工作人员在该特定星期应支付的金额。
但是,出现此错误:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at "O015596H.CALCULATE_WAGES", line 21
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.
我对SQL的素养还不足以真正知道如何使用Google搜索我的问题,因此我认为最好的选择是在此处解释我的问题,并希望有人能够理解。
感谢您的帮助!
答案 0 :(得分:4)
你知道这意味着什么吗?
WAGES NUMBER(6, 3);
这在小数点左边有三个数字(6-3),在小数点右边有三个数字,因此最大值为999.999
。我猜这是造成您问题的原因。 (您可以在documentation中了解数据类型。)
您只需忽略规模和精度,Oracle代码就可以工作。