Ordenación de resultados en castellano

Acabo de leer en Oracle Notepad un artículo muy interesante sobre la ordenación de resultados en castellano. Nunca pensé que la ordenación sería así. Supongo que porque en todas las bases de datos Oracle con las que he trabajado tenían el parámetro NLS_SORT fijado en español.

Para comprobar con qué ordenación por defecto está configurada nuestra base de datos basta con hacer una select de la tabla NLS_PARAMETER:

SQL> select * from NLS_DATABASE_PARAMETERS;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CSMIG_SCHEMA_VERSION       5
NLS_LANGUAGE                   SPANISH
NLS_TERRITORY                  SPAIN
NLS_CURRENCY                   ?
NLS_ISO_CURRENCY               SPAIN
NLS_NUMERIC_CHARACTERS         ,.
NLS_CHARACTERSET               WE8ISO8859P15
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD/MM/RR
NLS_DATE_LANGUAGE              SPANISH
NLS_SORT                       SPANISH
NLS_TIME_FORMAT                HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY              ?
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_NCHAR_CONV_EXCP            FALSE
NLS_RDBMS_VERSION              10.2.0.4.0
Anuncios

Campos null con precisión en vistas

Muchas veces he necesitado crear una vista para sustituir una antigua tabla. En ocasiones he tenido que mantener en la vista una columna que ya no existe pero que debo dejar por algún motivo. Lo que hago es definir la columna como “Función(NULL) AS NOMBRE_COLUMNA”. Si es VARCHAR2 pongo directamente NULL. Si quiero que sea un number TO_NUMBER(NULL) y si es una fecha TO_DATE(NULL). Por ejemplo:

CREATE OR REPLACE VIEW CAMPOS_NULOS AS(
  SELECT NULL              AS CADENA_VACIA,
         TO_NUMBER( NULL ) AS NUMERO_VACIO,
         TO_DATE( NULL )   AS FECHA_VACIA
  FROM DUAL )
/

Si hacemos un desc:

SQL> DESC CAMPOS_NULOS
 Nombre        ¿Nulo?   Tipo
 ------------- -------- ----------------------------
 CADENA_VACIA           VARCHAR2
 NUMERO_VACIO           NUMBER
 FECHA_VACIA            DATE

El único problema, como puede verse en el ejemplo, es que perdía la precisión. Sigue leyendo

Uso de expresiones regulares con Oracle

Muchas veces necesito saber qué registros de una tabla tienen valores no numéricos en un campo varchar. Normalmente me hago una función en un paquete y la utilizo en la select que toque:

FUNCTION esCadenaNumerica( vCadena VARCHAR2 ) RETURN VARCHAR2 IS 
  ------------
  -- Variables
  ------------
  nTonta NUMBER;
BEGIN 
  nTonta := TO_NUMBER( vCadena );

  -- Si llego hasta aquí es que el número es válido.
  RETURN 'TRUE';
EXCEPTION
  WHEN VALUE_ERROR THEN
    -- El número no es válido.
    RETURN 'FALSE';
END;

Sigue leyendo

Script de descripción de tablas mejorado

He introducido una mejora en el script que utilizo para describir tablas en el plus. En principio, tal como dije, me describe tablas del esquema en el que estoy. Esto lo hice así porque paso de estar todo el rato metiendo el nombre del usuario cuando, el 99,99% de los desc que hago son siempre de tablas o vistas del usuario con el que estoy conectado. Bueno, lo que he hecho es que el script se de cuenta de si lo que he escrito es un sinónimo. Sigue leyendo