PLS-00103 Грешка в края на функцията

Получаване на следната грешка, свързана с функция:

„ГРЕШКА на ред 20: PLS-00103: Срещна се символът „край на файла“, когато се очаква едно от следните: край не прагма финална инстанцируема поръчка, заменяща карта на конструктор на статичен член 0,01 секунди

CREATE OR REPLACE FUNCTION Function1
RETURN FLOAT
IS 
    PricePerBug FLOAT,
    NumberOfBugs NUMBER,
    TotalIncome FLOAT;
BEGIN
    SELECT SUM(ProjectValue) INTO TotalIncome FROM tblProject;
    SELECT COUNT(idBug) INTO NumberOfBugs FROM tblBug;
    PricePerBug := (NumberOfBugs)/(TotalIncome);
    RETURN PricePerBug;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('No data found, no result to display; exception handled...');
    WHEN TOO_MANY_ROWS THEN
    RETURN 'Too many rows returned...';
    WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20015, 'Unknown exception in function Function1.');
END Function1;
/

Всички предложения се оценяват...


person user725236    schedule 26.04.2011    source източник


Отговори (1)


Всички декларации трябва да завършват с точка и запетая, а не със запетая:

PricePerBug FLOAT;
NumberOfBugs NUMBER;
TotalIncome FLOAT;

Има други проблеми, несвързани с тази грешка, свързани с обработката на изключения:

  1. Ако NO_DATA_FOUND някога бъде повдигнат (няма да бъде), ще получите грешката „ORA-06503: PL/SQL: Функцията е върната без стойност“, защото обработвате изключението, но не връщате стойност.

  2. Ако TOO_MANY_ROWS някога бъдат повдигнати (няма да бъде), ще получите грешка, защото не можете да върнете текста „Върнати са твърде много редове...“ от функция, която връща само стойности от тип FLOAT!

  3. Ако някога е било повдигнато някакво друго изключение (може да е), вие няма да разберете какво е то, защото замествате полезното изключение на Oracle със собственото си неполезно съобщение „неизвестно изключение“.

Правилното количество обработка на грешки за тази конкретна функция е никакво, т.е.:

CREATE OR REPLACE FUNCTION Function1
RETURN FLOAT
IS 
    PricePerBug FLOAT;
    NumberOfBugs NUMBER;
    TotalIncome FLOAT;
BEGIN
    SELECT SUM(ProjectValue) INTO TotalIncome FROM tblProject;
    SELECT COUNT(idBug) INTO NumberOfBugs FROM tblBug;
    PricePerBug := (NumberOfBugs)/(TotalIncome);
    RETURN PricePerBug;
END Function1;
person Tony Andrews    schedule 26.04.2011