sql >> Base de Datos >  >> RDS >> Oracle

¿Función de mil separadores en Oracle?

Su función entrará en un BUCLE infinito y nunca saldrá de él. Aunque compila, eso no significa que la función funcione bien, ya que el problema ocurrirá en tiempo de ejecución.

La condición MIENTRAS siempre es VERDADERA y el contador nunca se incrementa, ya que la función nunca pasa a la condición SI.

Has configurado counter :=2 y luego su condición IF es:

¿Cómo podría ser verdad? 2 nunca es mayor que 2 , por lo tanto, el contador nunca se incrementa , ya que lo tienes dentro del IF-END IF bloquear.

Cuando ejecuta la función, nunca sale del bucle infinito.

Llegando a su requerimiento,

¿Por qué quieres reinventar la rueda cuando Oracle ya te proporciona el separador de miles?

De la documentación,

  • Elemento :G

  • Ejemplo:9G999

  • Descripción:Devuelve en la posición especificada el separador de grupo (el valor actual del parámetro NLS_NUMERIC_CHARACTER). Puede especificar varios separadores de grupos en un modelo de formato numérico.

Por ejemplo,

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.

Si desea que el nombre de la función sea el mismo que el de SQL Server función, luego simplemente cree una función definida por el usuario en la base de datos Oracle con el mismo nombre. La lógica sería la misma que la consulta anterior.

Por ejemplo,

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>

Ejecutemos la función :

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>