我有一个执行计算的Oracle函数,但没有返回结果的小数。
CREATE OR REPLACE Function MY_TESTE
RETURN DECIMAL
IS
BEGIN
RETURN 1/3;
END;
如果我执行了该功能
SELECT MY_TESTE
FROM DUAL
它返回值0和任何小数位。但它预计会回归0.3333 有什么想法吗?
答案 0 :(得分:5)
DECIMAL在SYS.STANDARD包中声明为NUMBER的子类型(与Oracle中的大多数数字类型一样),特别是NUMBER(38,0),这意味着DECIMAL值不能包含右边的数字小数点。为了使小数点右边有数字的DECIMAL值,必须将它们声明为这样,类似于
dValue DECIMAL(38, 4)
但是,如果要从函数返回这样的值,这将无济于事,因为在函数返回类型上不能有精度说明符。
为了使DECIMAL值具有从函数返回的小数位右边的数字,您需要声明DECIMAL的子类型,该子类型指定正确的小数位数并使用该子类型作为函数的返回类型。这是一个例子:
DECLARE
SUBTYPE DEC_10_3 IS DECIMAL(10, 3);
FUNCTION TEST1 RETURN DECIMAL
IS
d DECIMAL := 1/3;
BEGIN
RETURN d;
END TEST1;
FUNCTION TEST2 RETURN DECIMAL
IS
d DECIMAL(10, 3) := 1/3;
BEGIN
RETURN d;
END TEST2;
FUNCTION TEST3 RETURN DEC_10_3 IS
d DEC_10_3 := 1/3;
BEGIN
RETURN d;
END TEST3;
BEGIN
-- Test statements here
DBMS_OUTPUT.PUT_LINE('TEST1=' || TEST1);
DBMS_OUTPUT.PUT_LINE('TEST2=' || TEST2);
DBMS_OUTPUT.PUT_LINE('TEST3=' || TEST3);
END;
运行上面的内容会产生
TEST1=0
TEST2=0
TEST3=.333
分享并享受。
答案 1 :(得分:2)
将退货类型更改为NUMBER
您已在此解释了Oracle中DECIMAL和NUMBER数据类型之间的区别:decimal(s,p) or number(s,p)?
答案 2 :(得分:0)
默认为整数 对于存储除法结果,您需要十进制(10,3)例如
declare
l_res1 decimal(10, 3);
l_res2 decimal;
begin
l_res1 := 1 / 3;
dbms_output.put_line(l_res1);
l_res2 := 1 / 3;
dbms_output.put_line(l_res2);
end;
但是您不能在函数中使用十进制(10,3)作为返回类型,因此将十进制更改为数字
祝你好运答案 3 :(得分:0)
Bob Jarvis解释了使用DECIMAL
的问题。您可以使用TRUNC
(或ROUND
,具体取决于您希望它的行为方式)并返回仍然限制为所需小数位数的NUMBER
:
create or replace function my_test return number is
begin
return trunc(1/3, 4);
end;
/
select my_test from dual;
MY_TEST
----------
0.3333
使用不同的分数可以更好地证明TRUNC
和ROUND
之间的差异:
create or replace function my_test return number is
begin
return trunc(2/3, 4);
end;
/
select my_test from dual;
MY_TEST
----------
0.6666
create or replace function my_test return number is
begin
return round(2/3, 4);
end;
/
select my_test from dual;
FUNCTION MY_TEST compiled
MY_TEST
----------
0.6667
请注意,最新版本会在此版本中向上舍入最后一位数字。