Sua função entrará em um LOOP infinito e nunca sairá dele. Embora compile, isso não significa que a função funcionaria bem, pois o problema ocorrerá em tempo de execução.
A condição WHILE é sempre TRUE, e o contador nunca é incrementado, pois a função nunca entra na condição IF.
Você definiu
counter :=2
e, em seguida, sua condição SE é:Como poderia ser verdade? 2 nunca é maior que 2 , portanto, o contador nunca é incrementado , já que você o tem dentro do
IF-END IF
quadra. Quando você executa a função, ela nunca sai do loop infinito.
Vindo a sua exigência,
Por que você quer reinventar a roda quando a Oracle já fornece o separador de milhar.
Da documentação,
-
Elemento:G
-
Exemplo:9G999
-
Descrição :Retorna na posição especificada o separador de grupo (o valor atual do parâmetro NLS_NUMERIC_CHARACTER). Você pode especificar vários separadores de grupo em um modelo de formato numérico.
Por exemplo,
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 você quiser que o nome da função seja igual ao do SQL Server função, basta criar uma função definida pelo usuário no banco de dados Oracle com o mesmo nome. A lógica seria a mesma da consulta acima.
Por exemplo,
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>
Vamos executar a função :
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>