Я изо всех сил пытаюсь понять пользовательские функции и как вызывать их в запросе - PullRequest
1 голос
/ 04 мая 2019

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

Спасибо за любую помощь!

1 Ответ

4 голосов
/ 04 мая 2019

Знаете ли вы, что это значит?

WAGES NUMBER(6, 3);

У этого есть три цифры (6 - 3) слева от десятичной дроби и три справа, поэтому максимальное значение 999.999.Я предполагаю, что это является причиной вашей проблемы.(Вы можете узнать о типах данных в документации .)

Вы можете просто не учитывать масштаб и точность, и код Oracle должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...