编译时PL / Sql问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译时PL / Sql问题相关的知识,希望对你有一定的参考价值。

显然我需要第二眼,因为对于我的生活,我看不出问题是什么。我创建了一个“测试”包来测试我的包代码,并且我不断收到包含在包中的“无效SQL”或“子程序或游标”错误。这让我很生气...这是我的代码,简单的东西真的...包声明符合正常,包体给我错误。无论我放在包体顶部的任何函数都会编译,另外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;
/
答案

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

以上是关于编译时PL / Sql问题的主要内容,如果未能解决你的问题,请参考以下文章

编译过程时 PL/SQL 工具包 Web 应用程序错误

为啥有换行符时我的 PL/SQL 过程不能编译?

PL/SQL 编译失败时如何让 SQL*Plus 退出

如何确保在编译 PL/SQL 程序时启用了优化?

PostgreSQL vs Oracle:PL/pgSQL 的“编译时”检查

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?