我正在努力了解用户定义的函数以及如何在查询中调用它们

时间:2019-05-04 11:32:20

标签: oracle plsql

我必须创建一个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搜索我的问题,因此我认为最好的选择是在此处解释我的问题,并希望有人能够理解。

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

你知道这意味着什么吗?

WAGES NUMBER(6, 3);

这在小数点左边有三个数字(6-3),在小数点右边有三个数字,因此最大值为999.999。我猜这是造成您问题的原因。 (您可以在documentation中了解数据类型。)

您只需忽略规模和精度,Oracle代码就可以工作。