Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function PL/SQL:无法从包元素PL/SQL返回值_Function_Plsql_Package_Return Value - Fatal编程技术网

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

Function PL/SQL:无法从包元素PL/SQL返回值,function,plsql,package,return-value,Function,Plsql,Package,Return Value,我创建了以下包和包体: 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 (I

我创建了以下包和包体:

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;
/
我得到一个错误:

    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
为什么它不返回函数值?我是否必须向包头添加一个过程,以便它返回函数值


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

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

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

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

错误消息很清楚:
INTERESTS'不是过程
。这是一个函数。不能使用
execute
调用函数。尝试:
选择利息\u计算。利息('37904010329')从dual
声明x号;开始x:=利息_计算利息('37904010329');DBMS_输出。PUT_行(x);结束
这丢失了错误,但它返回空值,尽管我以前单独测试过该函数,并且应该返回一个实数。我遗漏了一些东西。但我现在得到了一个错误:第1行错误:ORA-06502:PL/SQL:数值或值错误:数字精度太大ORA-06512:在“LTELLISKIVI.INTEREST\u CALCULATION”第2行,我不明白。它有时给我错误,然后有时不返回错误和空值…感谢所有回答的人。我现在让它工作了。问题似乎是利率数字(2,3):=0.5;精度太大,这就是它返回空值的原因。因此,我得到了错误“PL/SQL数值或值错误:数字精度太大”。我还更改了“ID in char”-->“ID in loans.borrower\u ID%type”,但我不确定这是否有什么改进。
select interest_calculation.interests('37904010329') 
from dual;