Вашата функция ще влезе в безкраен LOOP и никога няма да излезе от него. Въпреки че се компилира, това не означава, че функцията ще работи добре, тъй като проблемът ще възникне по време на изпълнение.
Условието WHILE винаги е TRUE и броячът никога не се увеличава, тъй като функцията никога не влиза в условието IF.
Вие сте задали counter :=2
и след това вашето АКО условие е:
Как може да е истина? 2 никога не е по-голямо от 2 , следователно броячът никога не се увеличава , тъй като го имате вътре в IF-END IF
блокирай.
Когато изпълните функцията, тя никога не излиза от безкрайния цикъл.
Отговаряйки на вашите изисквания,
Защо искате да изобретите колелото, след като 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>