【问题标题】:Thousand Seperator function in oracle?oracle中的千位分隔符功能?
【发布时间】:2015-05-14 02:30:53
【问题描述】:

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

从对偶中选择 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:

【问题讨论】:

  • 请格式化您的代码。在编译没有错误之前,您不能调用您的函数。它有很多。
  • 我已经编译它没有给出任何错误。它给出以下消息。警告:执行已完成,警告 FUNCTION NUMERICFORMAT 已编译。
  • 警告意味着它有你需要修复的错误。在 END 语句后添加 SHOW ERRORS 以查看它们。或者在 SQL Developer 中找到数据库对象列表中的函数并点击它来查看错误。
  • @AdiChava 这根本不是 Oracle 语法。该函数永远不会编译时出现如此多的语法错误。目前还不清楚你在问什么。您能用简单的话解释一下业务需要什么吗?
  • 在 SQL 和 PL/SQL 语句中以 ; 终止:docs.oracle.com/cd/E11882_01/appdev.112/e25519/… 请阅读有关如何声明变量的手册:docs.oracle.com/cd/E11882_01/appdev.112/e25519/… 并且您需要阅读如何声明参数: docs.oracle.com/cd/E11882_01/appdev.112/e25519/…

标签: oracle function plsql


【解决方案1】:
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条件是:

如果计数器 > 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多