Plsql 函数不返回小数位

Plsql 函数不返回小数位,plsql,oracle11g,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 有什么想法吗?将返回类型更改为NUMBER 这里您已经解释了Oracle中十进制和数字数据类型之间的区别:将返回类型更改为NUMB

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

CREATE OR REPLACE Function MY_TESTE
   RETURN DECIMAL
   IS
BEGIN

  RETURN 1/3;

END;
如果我执行这个函数

SELECT MY_TESTE 
  FROM DUAL
它返回带任何小数点的值0。但预计回报率为0.3333
有什么想法吗?

将返回类型更改为
NUMBER


这里您已经解释了Oracle中十进制和数字数据类型之间的区别:

将返回类型更改为
NUMBER


在这里,您已经解释了Oracle中DECIMAL和NUMBER数据类型之间的区别:

在Oracle中,默认情况下DECIMAL与integer相似 对于存储分区结果,您需要十进制(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;
但您不能在函数中使用decimal(10,3)作为返回类型,所以请将decimal更改为number


OracleDecimal中的好运在默认情况下类似于整数 对于存储分区结果,您需要十进制(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;
但您不能在函数中使用decimal(10,3)作为返回类型,所以请将decimal更改为number


好运

十进制在软件包SYS.STANDARD中声明为数字的子类型(与Oracle中的大多数数字类型一样),特别是数字(38,0),这意味着十进制值不能在小数点右侧有数字。为了得到小数点右边有数字的十进制值,必须声明它们,类似于

dValue  DECIMAL(38, 4)
但是,如果您想从函数返回这样的值,这将没有帮助,因为函数返回类型上不能有精度说明符

要使从函数返回的小数位数右边有数字的十进制值,需要声明指定正确小数位数的十进制子类型,并将该子类型用作函数的返回类型。下面是一个例子:

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

共享和享受。

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

dValue  DECIMAL(38, 4)
但是,如果您想从函数返回这样的值,这将没有帮助,因为函数返回类型上不能有精度说明符

要使从函数返回的小数位数右边有数字的十进制值,需要声明指定正确小数位数的十进制子类型,并将该子类型用作函数的返回类型。下面是一个例子:

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

分享和享受。

鲍勃·贾维斯已经解释了使用十进制的问题。您可以使用
TRUNC
(或
ROUND
,具体取决于您希望它的行为)并返回一个仍然限制在所需小数位数以内的
数字:

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 

请注意,在这个版本中,最后一个版本将最后一个数字向上舍入。

Bob Jarvis解释了使用
十进制的问题。您可以使用
TRUNC
(或
ROUND
,具体取决于您希望它的行为)并返回一个仍然限制在所需小数位数以内的
数字:

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 

请注意,在这个版本中,最后一个版本将最后一位数字向上舍入。

不熟悉Oracle SQL,但在T-SQL中,除法的返回类型与参数的类型相同。也就是整数。不熟悉Oracle SQL,但在T-SQL中,除法的返回类型与参数的类型相同。主要的问题是我可以用小数点来声明返回值,就像创建或替换函数一样。我的测试返回的小数点(18,4)是BEGIN return的1/3;结束;尝试在选择中使用此函数;)@RuiSoares-我猜你的意思是“…**不能**用小数点声明返回值…”。。。这就是为什么我在回答中声明了DECIMAL的子类型,然后让其中一个函数返回该子类型。这有点尴尬,但在PL/SQL中,必须这样做。共享和享受。子类型是一个很好的解决方案,我忘记了这个功能)主要问题是我可以用小数位声明返回值,就像创建或替换函数一样。我的测试返回小数位(18,4)是BEGIN return 1/3;结束;尝试在选择中使用此函数;)@RuiSoares-我猜你的意思是“…**不能**用小数点声明返回值…”。。。这就是为什么我在回答中声明了DECIMAL的子类型,然后让其中一个函数返回该子类型。这有点尴尬,但在PL/SQL中,必须这样做。共享和享受。子类型是一个很好的解决方案,我忘记了这个功能)主要问题是我可以用小数位声明返回值,就像创建或替换函数一样。我的测试返回小数位(18,4)是BEGIN return 1/3;结束;所以@Bob Jarvis的答案就是你需要的。主要的问题是我可以用小数点来声明返回值,就像创建或替换函数一样。我的测试返回小数点(18,4)是BEGIN return 1/3;结束;所以@Bob Jarvis的答案就是你需要的。