2015-12-09 2 views
0

Я пишу простую функцию в 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; 
/

Как я могу решить эту проблему? Может быть, проблема в логике программы?

+0

Синтаксис для выполнения динамического SQL, предполагается, что вы хотите, чтобы ваш предикат использовал параметр 'f2', будет' выполнять немедленный 'select statement' в CurrentDay, используя id' –

+2

Я не вижу, где объявлена ​​переменная' ДНИ'. Есть и больше проблем - 'ВЫПОЛНИТЬ НЕМЕДЛЕННО 'ВЫБРАТЬ День_' || i || 'FROM Table_2 WHERE ЧЛВК_ИД = id INTO CurrentDay'; 'будет терпеть неудачу, так как' currentDay' не известен в этом контексте -> execute немедленный не видит переменные delared в контексте процедуры вызова. – krokodilko

+0

@kordirko Извините, 'ДНИ' теперь называется' WorkDays', я забыл изменить это. Так что, если CurrentDay выходит из контекста подзапроса, как я могу решить свою проблему с повторением n-го поля моей таблицы в 1 строке? И что такое ошибка PLS-00103 в моем случае? – iRomul

ответ

1

Это ошибка при разборе, и имейте в виду, что она часто не точно показывает ошибку, но где произошла следующая ошибка символа. Например:

declare 
    x number; 
    y number; 
begin 
if x = 1 then 
    y := 1  --I forget to put on the semi-colon to end the line 
end if; 
end; 

Ожидаемая ошибка в отсутствующей полуточке. Что вы получаете:

ORA-06550: line 7, column 2: 
PLS-00103: Encountered the symbol "END" when expecting one of the following: 

    * & = - + ; </> at in is mod remainder not rem 
    <an exponent (**)> <> or != or ~= >= <= <> and or like like2 
    like4 likec between || multiset member submultiset 
The symbol ";" was substituted for "END" to continue. 

Поскольку в комментариях вы говорите о смене вещей - возможно, чтобы сделать его более понятным для нас (и спасибо!), Это может быть затеняя фактический синтаксис глюк.

Две вещи я заметил:

Всего: = Зарплата * Рабочие;

То есть пространство между: и =, что не должно быть там

и:

FUNCTION f2 (id IN NUMBER) return NUMBER AS 

который обычно

FUNCTION f2 (id IN NUMBER) return NUMBER IS 
+0

'is' и' as' являются взаимозаменяемыми в этом контексте. См. Диаграмму для определения функции http://docs.oracle.com/database/121/LNPLS/function.htm#LNPLS1182. –

Смежные вопросы