Plsql 在PL/SQL页面中编写函数
我想创建一个函数,在oracle包中执行特定任务,我尝试使用下面的代码,但它给出了一个我不理解的错误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
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包缺乏了解。