函数不返回小数位

时间:2013-07-17 12:35:24

标签: plsql oracle11g

我有一个执行计算的Oracle函数,但没有返回结果的小数。

CREATE OR REPLACE Function MY_TESTE
   RETURN DECIMAL
   IS
BEGIN

  RETURN 1/3;

END;

如果我执行了该功能

SELECT MY_TESTE 
  FROM DUAL

它返回值0和任何小数位。但它预计会回归0.3333 有什么想法吗?

4 个答案:

答案 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)

Oracle DECIMAL中的

默认为整数 对于存储除法结果,您需要十进制(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

使用不同的分数可以更好地证明TRUNCROUND之间的差异:

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 

请注意,最新版本会在此版本中向上舍入最后一位数字。