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

Anuncios

Uso de deterministic

Cuando sabemos que dados unos parámetros una función devolverá siempre lo mismo deberíamos utilizar la expresión DETERMINISTC. Este hint le va a permitir al optimizador de Oracle evitar hacer llamadas redundantes a la función. Sólo se puede garantizar que una función devolverá lo mismo dados unos parámetros cuando no dependa de variables de sesión (como sysdate) y otros objetos de la base de datos (llamadas a funciones no deterministic o consultas). El caso más simple y más común es una función que devuelva el valor de una constante. También son comunes funciones de operaciones aritméticas o de concatenació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

Sintaxis de TO_NUMBER

Nunca he llegado a memorizar la manera de hacer un TO_NUMBER cuando es necesario pasarle un formato. Sólo suelo tener que hacerlo cuando estoy parseando datos de alguna manera. Una carga de loader o algo así. El caso es que siempre pierdo un tiempo precioso buscando la documentación. Por si a alguien le pasa lo mismo, aquí está el enlace: Syntax – TO_NUMBER.

Descripción de tablas

Una de las cosas que suelo necesitar ver de una tabla es, a parte de sus comentarios, las tablas a donde apuntan sus claves foráneas. Y también cual es la clave primaria. Este script permite ver todo eso. Usa vistas user_, pero es fácilmente modificable para utilizar vistas all_. Habrá que pedir entonces también como parámetro el propietario del objeto.
Como veréis, a la izquierda de la clave primaria aparece un asterisco. Después de la lista de columnas hay una sección para las claves foráneas donde se detalla la tabla a la que hace referencia y las columnas de la tabla que estamos describiendo que están involucradas en la clave ajena.
Sigue leyendo