0

我想创建一个在 oracle 包中执行特定任务的函数,我尝试使用下面的代码,但它给出了一个我不明白的错误。

CREATE OR REPLACE
PACKAGE DINIDU_EXE_PACKAGE AS

FUNCTION EXE14 
(SUP_ID_ SUPPLIER_PART_PROJECT_TAB.SUPPLIER_ID%TYPE,PAR_ID_ SUPPLIER_PART_PROJECT_TAB.PART_ID%TYPE,PRO_ID_ SUPPLIER_PART_PROJECT_TAB.PROJECT_ID%TYPE) RETURN NUMBER IS

QUNTITY_FOR_A_PROJECT_ NUMBER;

BEGIN
  SELECT QUENTITY AS QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB WHERE SUPPLIER_ID=SUP_ID AND PART_ID=PAR_ID AND PRO_ID=PROJECT_ID;

    IF QUNTITY_FOR_A_PROJECT_ >0 THEN

      RETURN QUNTITY_FOR_A_PROJECT_;
    ELSE
      RETURN 0;

    END IF;

END EXE14;

END;

错误(6,1):PLS-00103:在预期以下之一时遇到符号“QUNTITY_FOR_A_PROJECT_”:语言

4

2 回答 2

2

叶戈尔的评论是正确的。您正在将一个函数放入包规范中,而它必须位于包体中。

只有对函数或其签名的引用——函数名和参数列表——必须在包规范中。实际功能必须在正文中编码。

CREATE OR REPLACE PACKAGE DINIDU_EXE_PACKAGE AS
    FUNCTION EXE14 
    ( SUP_ID_ SUPPLIER_PART_PROJECT_TAB.SUPPLIER_ID%TYPE
    , PAR_ID_ SUPPLIER_PART_PROJECT_TAB.PART_ID%TYPE
    ,PRO_ID_ SUPPLIER_PART_PROJECT_TAB.PROJECT_ID%TYPE)
END;
/

CREATE OR REPLACE PACKAGE BODY DINIDU_EXE_PACKAGE AS
    FUNCTION EXE14 
    ( SUP_ID_ SUPPLIER_PART_PROJECT_TAB.SUPPLIER_ID%TYPE
    , PAR_ID_ SUPPLIER_PART_PROJECT_TAB.PART_ID%TYPE
    ,PRO_ID_ SUPPLIER_PART_PROJECT_TAB.PROJECT_ID%TYPE)
RETURN NUMBER IS
    QUNTITY_FOR_A_PROJECT_ NUMBER;
BEGIN
  SELECT QUENTITY AS QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB WHERE SUPPLIER_ID=SUP_ID AND PART_ID=PAR_ID AND PRO_ID=PROJECT_ID;

    IF QUNTITY_FOR_A_PROJECT_ >0 THEN

      RETURN QUNTITY_FOR_A_PROJECT_;
    ELSE
      RETURN 0;

    END IF;

END EXE14;

END;
/
于 2013-03-19T09:28:19.437 回答
1

编辑:有关编译错误的实际原因,请参阅 Egor 的评论和 Rachcha 的回答。

您的代码首先声明QUNTITY_FOR_A_PROJECT_为局部变量,但随后您的SELECT语句使用与列别名 ( ) 相同的标识符QUENTITY AS QUNTITY_FOR_A_PROJECT_。更重要的是,您没有选择INTO任何结果。

我认为你打算做这样的事情:

SELECT QUENTITY INTO QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB ...

另一个问题:您的函数接受以下参数:和SUP_ID_,但您不在函数中使用它们。我怀疑在查询中没有正确使用标识符,但我不能确定,因为我不知道你的表的列是什么。PAR_ID_PRO_ID_SUPPLIER_PART_PROJECT_TAB

于 2013-03-19T07:22:42.967 回答