Ошибка PL/Sql при компиляции

Очевидно, мне нужна вторая пара глаз, потому что я всю жизнь не могу понять, в чем проблема. Я создал «тестовый» пакет для проверки кода моего пакета, и я продолжаю получать сообщение об ошибке «Неверный SQL» или «подпрограмма или курсор», содержащиеся в пакете, не существует. Это сводит меня с ума ... вот мой код, на самом деле все просто ... объявление пакета соответствует требованиям, тело пакета выдает мне ошибку. Любая функция, которую я поместил вверху тела пакета, будет скомпилирована, а две другие нет и выдадут мне одну из двух ошибок, описанных выше. Изначально у меня это было в другом пакете, содержащем более 10 000 строк кода, но я создал этот тестовый пакет, потому что при его компиляции я получал всевозможные странные сообщения об ошибках, поэтому я вынул его, и этот пакет компилируется и работает нормально. Я использую Toad v10.0.0.41 для доступа к базе данных, а не Sql * Plus, использую Toad уже много лет.

Упаковка:

CREATE OR REPLACE PACKAGE SomeSchema.TestPackage AS

FUNCTION PrimaryContactFullName (pPrimaryContact IN Varchar2, pFatherName IN Varchar2, pMothername IN Varchar2) RETURN VARCHAR2;

FUNCTION PrimaryContactFirstName(pPrimaryContact IN Varchar2, pFatherFirstName IN Varchar2, pMotherFirstname IN Varchar2) RETURN VARCHAR2;

FUNCTION PrimaryContactLastName(pPrimaryContact IN Varchar2, pFatherLastName IN Varchar2, pMotherLastname IN Varchar2) RETURN VARCHAR2;

END TestPackage;
/

Тело пакета:

CREATE OR REPLACE PACKAGE BODY SomeSchema.TestPackage IS
    FUNCTION PrimaryContactFirstName(pPrimaryContact IN Varchar2, pFatherFirstName IN Varchar2, pMotherFirstName IN Varchar2) RETURN VARCHAR2 IS
        W_FullName Varchar2(100);
    BEGIN
            IF Upper(pPrimaryContact) = 'MOTHER' Then
                W_FullName :=  pMotherFirstName;
            ELSIF Upper(pPrimaryContact) = 'FATHER' Then
                W_FullName :=  pFatherFirstName;
            ELSE
                W_FullName :=  pMotherFirstName;
            END IF;
            RETURN W_FullName;
        END;
    END;
    FUNCTION PrimaryContactLastName(pPrimaryContact IN Varchar2, pFatherLastName IN Varchar2, pMotherLastname IN Varchar2) RETURN VARCHAR2 IS
            W_FullName Varchar2(100);
    BEGIN
            IF Upper(pPrimaryContact) = 'MOTHER' Then
                W_FullName :=  pMotherLastName;
            ELSIF Upper(pPrimaryContact) = 'FATHER' Then
                W_FullName :=  pFatherLastName;
            ELSE
                W_FullName :=  pMotherLastName;
            END IF;
            RETURN W_FullName;
   END;
    FUNCTION PrimaryContactFullName(pPrimaryContact IN Varchar2, pFatherName IN Varchar2, pMothername IN Varchar2) RETURN VARCHAR2 IS
       W_FullName Varchar2(100);
    BEGIN
            IF Upper(pPrimaryContact) = 'MOTHER' Then
                W_FullName :=  pMotherName;
            ELSIF Upper(pPrimaryContact) = 'FATHER' Then
                W_FullName :=  pFatherName;
            ELSE
                W_FullName :=  pMotherName;
           END IF;
            RETURN W_FullName;
        END;
    END;
/

person Prescott Chartier    schedule 09.02.2018    source источник


Ответы (1)


У вас есть дополнительный оператор END; между концом вашей функции PrimaryContactFirstName и началом вашей функции PrimaryContactLastName.

person Sentinel    schedule 09.02.2018
comment
Мало того, что есть лишний конец в начале, есть лишний конец в середине И.... нет конца.... подождите..... в конце! Лол... вау... я просто не мог этого увидеть... - person Prescott Chartier; 10.02.2018
comment
Вот где форматирование вашего кода полезно. Такая ошибка выскакивает у вас. - person William Robertson; 10.02.2018
comment
Я всегда форматирую свой код только по этой причине, просто не мог видеть этот. Теперь, когда я могу, это чертовски очевидно... лол.... - person Prescott Chartier; 10.02.2018
comment
Код, опубликованный выше, имел только один дополнительный END; утверждение. Я удалил это, и он отлично скомпилировался в моей тестовой базе данных. - person Sentinel; 14.02.2018