Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função de mil separadores no oráculo?


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>