PLS-00103 Ошибка в конце функции - PullRequest
2 голосов
/ 26 апреля 2011

Получение следующей ошибки, относящейся к функции:

'ОШИБКА в строке 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;
/

Любые предложения приветствуются ...

1 Ответ

7 голосов
/ 26 апреля 2011

Все объявления должны заканчиваться точкой с запятой, а не запятой:

PricePerBug FLOAT;
NumberOfBugs NUMBER;
TotalIncome FLOAT;

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

  1. Если NO_DATA_FOUND когда-либо был поднят (это не будет) вы бы получили ошибка "ORA-06503: PL / SQL: функция вернулся без значения "потому что вы обработать исключение, но не вернуть значение.

  2. Если когда-нибудь было вызвано TOO_MANY_ROWS (этого не произойдет), вы получите сообщение об ошибке, потому что вы не можете вернуть текст 'Too many row Возвращено ...' из функции, которая возвращает только значения типа FLOAT !

  3. Если когда-либо возникло какое-либо другое исключение (оно может быть), вы не будете знать, что это такое, потому что заменяете полезное исключение Oracle своим собственным бесполезным сообщением "неизвестное исключение".

Правильный объем обработки ошибок для этой конкретной функции - none, т. Е .:

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;
...