PL/Sql 编译时出现问题

PL/Sql Issue when compiling

显然我需要另一双眼睛,因为我这辈子都看不出问题出在哪里。我创建了一个 "test" 包来测试我的包代码,但我不断收到错误 "Invalid SQL" 或 "subprogram or cursor" contained in package doesn't exist。这让我发疯……这是我的代码,真的很简单……包声明符合要求,包体给我错误。无论我放在包体顶部的什么功能都会编译,其他 2 个不会编译并给我上述 2 个错误之一。我最初在另一个包含 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;
/

PrimaryContactFirstName 函数的结尾和 PrimaryContactLastName 函数的开头之间有一个额外的 END; 语句。