Я должен создать 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, как показано здесь . Здесь - типы данных для этой таблицы.Появится окно с просьбой ввести аргументы, а затем оно выдаст возвращаемое значение, что тоже правильно.
Вот скриншот для таблицы 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 решить мою проблему, поэтому я решил, что лучше всего было бы объяснить мою проблемуздесь и надеюсь, кто-то понимает.
Спасибо за любую помощь!