oracle中的千位分离器功能?

时间:2015-05-14 02:30:54

标签: oracle function plsql

当我执行此函数时,它被编译并且不会给出任何错误,但是当在select语句中使用该函数时它会给出错误。请帮我解决这个问题。选择查询是这样的。

从dual中选择numericformat(facval,5);

 create or replace FUNCTION NumericFormat
  (num IN decimal,
   decimals IN int 
  ) 
RETURN VARCHAR2
IS
 ReturnVal VARCHAR(50) ;
 sPDecFormat VARCHAR(20) ;
 sDecFormat VARCHAR(50) ;
 counter INT;
BEGIN
   counter := 4 ;
   sPDecFormat :='.00';
   WHILE counter<=decimals
     LOOP
        IF counter > 2 then
        sPDecFormat :=sPDecFormat + '0';
          counter :=counter+1;
     END IF;
     END LOOP;
     sDecFormat := '###0' + sPDecFormat ;
    ReturnVal := TO_CHAR(num,sdecformat);
RETURN ReturnVal;
END NUMERICFORMAT;

错误是错误报告:

SQL Error: ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "ACC07.NUMERICFORMAT", line 21
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

1 个答案:

答案 0 :(得分:0)

counter := 2 ;
   sPDecFormat :='.00';
     WHILE counter<=decimals
     LOOP
      IF counter > 2 then
        sPDecFormat :=sPDecFormat+'0';
          counter :=counter+1;
      END IF;   
      END LOOP;

你的功能将进入无限循环,永远不会出现。虽然它编译,但这并不意味着该函数可以正常工作,因为问题将在运行时发生。

WHILE条件始终为TRUE,并且计数器从不递增,因为函数永远不会进入IF条件。

您已设置counter :=2,然后 IF条件为:

  

IF计数器&gt; 2然后

怎么可能是真的? 2绝不会大于2 ,因此计数器永远不会增加,因为您将其放在IF-END IF块中。

执行该函数时,它永远不会出现在无限循环中。

根据您的要求,

  

oracle中的千位分离器功能?

当Oracle已经为您提供千位分隔符时,您为什么要重新发明轮子。

来自文档,

  • 元素:G

  • 示例:9G999

  • 描述:在指定位置返回组分隔符(NLS_NUMERIC_CHARACTER参数的当前值)。您可以在数字格式模型中指定多个组分隔符。

例如,

SQL> SELECT TO_CHAR(sal,'999G999') FROM emp;

TO_CHAR(
--------
     800
   1,600
   1,250
   2,975
   1,250
   2,850
   2,450
   3,000
   5,000
   1,500
   1,100
     950
   3,000
   1,300

14 rows selected.

如果希望函数名称与 SQL Server 函数的名称相同,则只需在Oracle数据库中创建一个具有相同名称的用户定义函数。逻辑与上面的查询相同。

例如,

SQL> CREATE OR REPLACE FUNCTION NumericFormat(
  2        col NUMBER)
  3      RETURN VARCHAR2
  4    AS
  5      o_num VARCHAR2(20);
  6  BEGIN
  7      o_num:=TO_CHAR(col,'999G999');
  8      RETURN o_num;
  9  END;
 10  /

Function created.

SQL>
SQL> sho err
No errors.
SQL>

让我们执行功能

SQL> SELECT NumericFormat(sal) FROM emp;

NUMERICFORMAT(SAL)
----------------------------------------------
     800
   1,600
   1,250
   2,975
   1,250
   2,850
   2,450
   3,000
   5,000
   1,500
   1,100
     950
   3,000
   1,300

14 rows selected.

SQL>