Jan 25

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:

1
2
3
4
5
6
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. Continue reading »

Aug 24

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;

Continue reading »

Jul 26

Uniendo el script que obtiene las tablas que apuntan a una con la utilidad del todopoderoso paquete DMBS_METADATA me he hecho otro script que me obtiene el ddl de las claves foráneas que apuntan a una tabla determinada. Continue reading »

Jul 25

Este es un script para obtener un listado con las claves foráneas que apuntan a la tabla que le pasan como parámetro. Es útil si tenemos la buena costumbre de nombrar las claves con algún sufijo o prefijo que nos indiquen el tipo. Si no, sería necesario agregar más columnas a la select. Continue reading »

Jul 24

Otra función interesante del paquete DBMS_METADATA es get_Granted_DDL. Tal como su nombre sugiere, te devuelve el código ddl de los permisos que tenga el usuario que le pasas como parámetro. Continue reading »

Jul 21

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. Continue reading »

Jul 20

Cuando creo una vista, me gusta ponerle comentarios a ella y también a sus columnas. Normalmente es un rollo porque tengo que copy-pastearme las columnas y luego ir haciendo el comment on column. Lo peor del copy-paste es que es muy fácil cometer errores inadvertidamente (y cambiarle los comentarios a otra tabla o cosas por el estilo). Por esto y por gandulería informática, me he hecho un script para ahorrame trabajo y errores. Continue reading »

Jul 09

Me he visto obligado a sustituir algunas tablas de un esquema por vistas sobre otro. La idea es hacer una refactorización, por lo que necesito asegurarme de que las nuevas vistas tengan las mismas columnas que las antiguas tablas. Continue reading »

Jul 05

Estaba navegando por estos mundos de Oracle buscando algún consejo sobre la forma más eficiente de montar una union y me he topado con este interesante documento sobre tips de sql. Creo que todos los que trabajamos con consultas SQL en Oracle deberíamos conocerlos: SQL Tuning Tips.
Especialmente curioso me ha parecido el primero de ellos que viene a aconsejar seguir algún tipo de patron a la hora de construir las consultas. Es algo que me gusta hacer, pero nunca hubiera pensado que pudiera respaldarlo con argumentos tuneros.

Feb 02

Este es un script muy tonto para ver los datafiles que componen los tablespaces, pero, como no lo tengo en ningún sitio, pues me toca volver a escribirlo cada vez. Lo pongo aquí y así la próxima vez es copy-paste.

1
2
3
4
5
6
7
8
9
10
BREAK ON TABLESPACE_NAME 
COLUMN TABLESPACE_NAME FORMAT A20 
COLUMN FILE_NAME FORMAT A50 
 
SELECT TABLESPACE_NAME, FILE_NAME, 
       ROUND( BYTES/1024/1024,2) "MB", 
       ROUND( MAXBYTES/1024/1024,2) "MB MAX" 
FROM   DBA_DATA_FILES 
ORDER BY TABLESPACE_NAME, FILE_NAME 
/