函数不返回小数位

Rui*_*res 1 plsql oracle11g

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

CREATE OR REPLACE Function MY_TESTE
   RETURN DECIMAL
   IS
BEGIN

  RETURN 1/3;

END;
Run Code Online (Sandbox Code Playgroud)

如果我执行了这个功能

SELECT MY_TESTE 
  FROM DUAL
Run Code Online (Sandbox Code Playgroud)

它返回值0和任何小数位.但它预计会返回0.3333任何想法?

Bob*_*ica 5

DECIMAL在SYS.STANDARD包中声明为NUMBER的子类型(与Oracle中的大多数数字类型一样),特别是NUMBER(38,0),这意味着DECIMAL值不能包含小数点右边的数字点.为了使小数点右边有数字的DECIMAL值,必须将它们声明为,类似于

dValue  DECIMAL(38, 4)
Run Code Online (Sandbox Code Playgroud)

但是,如果要从函数返回这样的值,这将无济于事,因为在函数返回类型上不能有精度说明符.

为了使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;
Run Code Online (Sandbox Code Playgroud)

运行以上将产生

TEST1=0
TEST2=0
TEST3=.333
Run Code Online (Sandbox Code Playgroud)

分享和享受.