当我执行此函数时,它被编译并且不会给出任何错误,但是当在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:
答案 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>