Я пишу простую функцию в Oracle Database 11g, которая подсчитывает суммарный заработок для сотрудника. Для этого нам нужно подсчитать дни с определенным статусом. Дни присутствуют в виде полей в таблице (Day_1, Day_2, ..., Day_30).
Но я получил ошибку во время компиляции:
Error(50,9): PLS-00103: Encountered the symbol ";" when expecting one of the following: :=.(@%;
код моего пакета (место, где есть ошибка отмечается в коде функции f2
):Oracle Database PLSQL Ошибка: PLS-00103
CREATE OR REPLACE PACKAGE pack IS
FUNCTION f1 (id IN NUMBER) return t2 PIPELINED;
FUNCTION f2 (id IN NUMBER) return number;
end pack;
/
CREATE OR REPLACE PACKAGE BODY pack IS
FUNCTION f1 (id IN NUMBER) return t2 PIPELINED IS
name VARCHAR2(50);
num number;
BEGIN
FOR i IN 1 .. id LOOP
SELECT отдел
into name
from отдел
where ид_отдела = i;
select sum(КОЛИЧЕСТВО)
into num
from Таблица_3
join Таблица_2
on Таблица_3.КТО_ПРОДАЛ = Таблица_2.ЧЛВК_ИД
where отдел = i;
PIPE ROW(t1(i, name, num));
END LOOP;
RETURN;
END f1;
FUNCTION f2 (id IN NUMBER) return NUMBER AS
WorkingDays NUMBER := 0;
CurrentDay VARCHAR2(50);
Salary NUMBER := 120;
Total NUMBER := 0;
BEGIN
FOR i IN 1 .. 30 LOOP
EXECUTE IMMEDIATE 'SELECT День_' || i || ' FROM Таблица_2 WHERE ЧЛВК_ИД = id INTO CurrentDay';
IF WorkingDays IN ('КОМАНДИРОВКА','ВЫХОДНОЙ','ПРАЗДНИК') THEN -- <--- Here
WorkingDays := WorkingDays + 1;
END IF;
END LOOP;
Total : = Salary * WorkingDays;
RETURN Total;
END f2;
end pack;
/
Как я могу решить эту проблему? Может быть, проблема в логике программы?
Синтаксис для выполнения динамического SQL, предполагается, что вы хотите, чтобы ваш предикат использовал параметр 'f2', будет' выполнять немедленный 'select statement' в CurrentDay, используя id' –
Я не вижу, где объявлена переменная' ДНИ'. Есть и больше проблем - 'ВЫПОЛНИТЬ НЕМЕДЛЕННО 'ВЫБРАТЬ День_' || i || 'FROM Table_2 WHERE ЧЛВК_ИД = id INTO CurrentDay'; 'будет терпеть неудачу, так как' currentDay' не известен в этом контексте -> execute немедленный не видит переменные delared в контексте процедуры вызова. – krokodilko
@kordirko Извините, 'ДНИ' теперь называется' WorkDays', я забыл изменить это. Так что, если CurrentDay выходит из контекста подзапроса, как я могу решить свою проблему с повторением n-го поля моей таблицы в 1 строке? И что такое ошибка PLS-00103 в моем случае? – iRomul