La tua funzione entrerà in un LOOP infinito e non ne uscirà mai. Sebbene venga compilato, ciò non significa che la funzione funzioni correttamente, poiché il problema si verificherà in fase di esecuzione.
La condizione WHILE è sempre TRUE e il contatore non viene mai incrementato, poiché la funzione non passa mai alla condizione IF.
Hai impostato counter :=2
e poi la tua condizione IF è:
Come potrebbe mai essere vero? 2 non è mai maggiore di 2 , quindi il contatore non viene mai incrementato , dato che ce l'hai dentro IF-END IF
blocco.
Quando esegui la funzione, non esce mai dal ciclo infinito.
Venendo alle tue esigenze,
Perché vuoi reinventare la ruota quando Oracle ti fornisce già il separatore dei mille.
Dalla documentazione,
-
Elemento :G
-
Esempio:9G999
-
Descrizione :Restituisce nella posizione specificata il separatore di gruppo (il valore corrente del parametro NLS_NUMERIC_CHARACTER). Puoi specificare più separatori di gruppo in un modello di formato numerico.
Ad esempio,
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.
Se vuoi che il nome della funzione sia uguale a quello di SQL Server funzione, quindi basta creare una funzione definita dall'utente nel database Oracle con lo stesso nome. La logica sarebbe la stessa della query precedente.
Ad esempio,
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>
Eseguiamo la funzione :
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>