Din funktion kommer att gå in i en oändlig LOOP och kommer aldrig att komma ur den. Även om det kompileras betyder det inte att funktionen skulle fungera bra, eftersom problemet kommer att uppstå under körning.
WHILE-villkoret är alltid TRUE och räknaren ökar aldrig, eftersom funktionen aldrig går in i IF-tillståndet.
Du har ställt in counter :=2
och sedan ditt OM-tillstånd är:
Hur kunde det någonsin vara sant? 2 är aldrig större än 2 , därför ökas räknaren aldrig , eftersom du har det i IF-END IF
blockera.
När du kör funktionen kommer den aldrig ut ur den oändliga slingan.
Kommer till ditt krav,
Varför vill du uppfinna hjulet på nytt när Oracle redan ger dig tusenseparatorn.
Från dokumentation,
-
Element :G
-
Exempel:9G999
-
Beskrivning :Returnerar gruppavgränsaren i den angivna positionen (det aktuella värdet på parametern NLS_NUMERIC_CHARACTER). Du kan ange flera gruppseparatorer i en modell med nummerformat.
Till exempel,
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.
Om du vill att funktionsnamnet ska vara detsamma som SQL Server funktionen, skapa sedan bara en användardefinierad funktion i Oracle-databasen med samma namn. Logiken skulle vara densamma som ovanstående fråga.
Till exempel,
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>
Låt oss köra funktionen :
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>