Plsql 在PL/SQL页面中编写函数

Plsql 在PL/SQL页面中编写函数,plsql,oracle11g,Plsql,Oracle11g,我想创建一个函数,在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.P

我想创建一个函数,在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:在预期以下情况之一时遇到符号“Quantity”用于项目:语言编辑:有关编译错误的实际原因,请参阅Egor的评论和Rachcha的回答

代码首先将项目的
quantity\u声明为局部变量,然后
SELECT
语句使用与列别名相同的标识符(
QUENTITY as quantity\u用于项目)。更重要的是,您没有将结果
选择到任何内容中

我想你是想做这样的事:

SELECT QUENTITY INTO QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB ...

另一个问题:函数接受以下参数:
SUP\u ID\u
PAR\u ID\u
PRO\u ID\u
,但在函数中不使用它们。我怀疑在查询中没有正确使用标识符,但我无法确定,因为我不知道您的
供应商\u零件\u项目\u选项卡的列是什么。

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

代码首先将项目的
quantity\u声明为局部变量,然后
SELECT
语句使用与列别名相同的标识符(
QUENTITY as quantity\u用于项目)。更重要的是,您没有将结果
选择到任何内容中

我想你是想做这样的事:

SELECT QUENTITY INTO QUNTITY_FOR_A_PROJECT_ FROM SUPPLIER_PART_PROJECT_TAB ...

另一个问题:函数接受以下参数:
SUP\u ID\u
PAR\u ID\u
PRO\u ID\u
,但在函数中不使用它们。我怀疑在查询中没有正确使用标识符,但我无法确定,因为我不知道您的
供应商\u零件\u项目\u选项卡
表的列是什么。

Egor的评论是正确的。您将函数放入包规范中,而它必须放在包体中

包规范中只能包含对函数或其签名的引用(函数名和参数列表)。实际功能必须在主体中进行编码

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;
/

埃戈尔的评论是对的。您将函数放入包规范中,而它必须放在包体中

包规范中只能包含对函数或其签名的引用(函数名和参数列表)。实际功能必须在主体中进行编码

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;
/

函数定义应该放在包体中,而不是包规范中。函数定义应该放在包体中,而不是包规范中。谢谢你的帮助Jeffery,实际上是因为我对pl/sql包缺乏了解。谢谢你的帮助Jeffery,实际上,这是因为我对pl/sql包缺乏了解。