Twoja funkcja przejdzie do nieskończonej PĘTLI i nigdy z niej nie wyjdzie. Mimo że się kompiluje, nie oznacza to, że funkcja będzie działać poprawnie, ponieważ problem wystąpi w czasie wykonywania.
Warunek WHILE jest zawsze TRUE, a licznik nigdy się nie zwiększa, ponieważ funkcja nigdy nie przechodzi w warunek JEŻELI.
Ustawiłeś counter :=2
a następnie warunek JEŻELI jest:
Jak to może być kiedykolwiek prawdziwe? 2 nigdy nie jest większe niż 2 , dlatego licznik nigdy nie jest zwiększany , ponieważ masz go w IF-END IF
blokować.
Kiedy wykonujesz tę funkcję, nigdy nie wychodzi ona z nieskończonej pętli.
Spełniając Twoje wymagania,
Dlaczego chcesz wymyślać koło na nowo, skoro Oracle już zapewnia separator tysięcy.
Z dokumentacji,
-
Element:G
-
Przykład:9G999
-
Opis :Zwraca w określonej pozycji separator grupy (bieżąca wartość parametru NLS_NUMERIC_CHARACTER). Możesz określić wiele separatorów grup w modelu formatu liczb.
Na przykład
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.
Jeśli chcesz, aby nazwa funkcji była taka sama jak w SQL Server funkcji, a następnie po prostu utwórz funkcję zdefiniowaną przez użytkownika w bazie danych Oracle o tej samej nazwie. Logika byłaby taka sama jak w powyższym zapytaniu.
Na przykład
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>
Wykonajmy funkcję :
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>