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;
语句。
显然我需要另一双眼睛,因为我这辈子都看不出问题出在哪里。我创建了一个 "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;
语句。