PL/SQL:无法从包元素 PL/SQL 返回值

Posted

技术标签:

【中文标题】PL/SQL:无法从包元素 PL/SQL 返回值【英文标题】:PL/SQL: Unable to return value from Package elements PL/SQL 【发布时间】:2015-10-18 20:33:02 【问题描述】:

我已经创建了以下包和包体:

CREATE OR REPLACE PACKAGE interest_calculation IS
interest_rate number(2,3) := 0.5;
FUNCTION interests (ID IN char)
RETURN number;
END interest_calculation;
/


CREATE OR REPLACE PACKAGE BODY interest_calculation
IS 
FUNCTION interests
(ID IN char)
RETURN number
IS
CURSOR ecursor IS
    SELECT l.borrower_id, l.shiffer, l.date, l.return_date, r.price
    FROM loans l, books r   
    WHERE l.shiffer=r.shiffer AND borrower_id = ID;
kirje ecursor%ROWTYPE;
summed number(4,2) := 0;
interest number(4,2);
period integer;
BEGIN
FOR kirje IN ecursor LOOP
    period := kirje.return_date - kirje.date;
    IF period < 15 THEN
    interest := 0;
    ELSE
    interest := (period - 14) * kirje.price * (interest_rate/100) ;
    END IF;
    summed := summed + interest;
    END LOOP;
RETURN summed;
END;
END interest_calculation;
/

当我调用包函数时:

 execute interest_calculation.interests('37904010329');

我得到一个错误:

    ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00221: 'INTERESTS' is not a procedure or is undefined
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

为什么不返回函数值?我是否必须在包头中添加一个过程才能返回函数值?

非常感谢您提供的任何帮助。

【问题讨论】:

错误信息很清楚:INTERESTS' is not a procedure。这是一个函数。您不能使用execute 调用函数。试试:SELECT interest_calculation.interests('37904010329') FROM dualDECLARE x NUMBER; BEGIN x:=interest_calculation.interests('37904010329'); DBMS_OUTPUT.PUT_LINE( x ); END; 这丢失了错误但它返回了空值,尽管我之前单独测试了该函数并且应该返回一个实数。我错过了一些东西。 【参考方案1】:

您可以对过程使用 execute 关键字。在包中,您创建了一个函数。要获得结果,您应该按以下格式执行函数。

select interest_calculation.interests('37904010329') 
from dual;

函数必须从 SQL 或 PL/SQL 语句中调用,其中函数返回的值被使用 - 即,分配给变量,作为参数传递等。

【讨论】:

但是我现在得到一个错误:第 1 行的错误:ORA-06502:PL/SQL:数字或值错误:数字精度太大 ORA-06512:在“LTELLISKIVI.INTEREST_CALCULATION”,第 2 行 我不明白。它有时会给我错误,然后有时不返回错误和空值... 感谢所有回答的人。我现在开始工作了。似乎问题在于 interest_rate number(2,3) := 0.5;精度太大,这就是它返回空值的原因。因此,我得到“PL/SQL 数字或值错误:数字精度太大”的错误。我还更改了“字符中的 ID”->“贷款中的 ID.borrower_ID%type”,但我不确定这是否有所改善。

以上是关于PL/SQL:无法从包元素 PL/SQL 返回值的主要内容,如果未能解决你的问题,请参考以下文章

在 pl/sql 正文包文件中获取函数和描述注释

从 PL/SQL 函数返回多个值

“成员”集合的 PL/SQL 否定不否定

无法从 cmd PL/SQL 中的简单查询中获得正确的结果

从 pl/sql 中的函数返回数据作为光标而不创建类型 oracle 11g

PL/SQL ORA-01422:精确提取返回的行数超过了请求的行数