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
/ |