Documentos de Académico
Documentos de Profesional
Documentos de Cultura
En esta sección, abordo el tema de cómo dar el formato a las consultas que hacemos a la base de datos, por medio del cliente de
Oracle, el Sql Plus.
Todos los que hemos tenido acceso a un prompt de Oracle por medio del Sql Plus, nos hemos topado con el problema de que las
consultas que hacemos, nos arrojan resultados algo revueltos como lo que se muestra a continuación:
set linesize n
Cambia el tamaño de la línea a los n caracteres. después del último caracter en un renglón, le agrega espacios para rellenar hasta el
valor asignado. Se puede abreviar como set lines n.
Por ejemplo:
USERNAME
------------------------------
PASSWORD
------------------------------
SALT
4195FE23CF28FA4E
SYSTEM
9887149C9890214A
SYS
4790272FCF800D71
USERNAME
------------------------------
PASSWORD
------------------------------
ADMAUD
A101B2757316EC78
4 rows selected.
y con el cambio pertinente:
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
SYSTEM 9887149C9890214A
SYS 4790272FCF800D71
ADMAUD A101B2757316EC78
4 rows selected.
set pagesize n
Define la cantidad de renglones que se mostrarán entre títulos. Los renglones que ocupa cada título también cuentan en n. Se puede
abreviar como set pages n. Así, en el siguiente ejemplo se vería:
SQL> set pages 4
SQL> /
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
USERNAME PASSWORD
------------------------------ ------------------------------
SYSTEM 9887149C9890214A
USERNAME PASSWORD
------------------------------ ------------------------------
SYS 4790272FCF800D71
USERNAME PASSWORD
------------------------------ ------------------------------
ADMAUD A101B2757316EC78
4 rows selected.
y con el cambio:
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
SYSTEM 9887149C9890214A
SYS 4790272FCF800D71
ADMAUD A101B2757316EC78
4 rows selected.
Si n = 0, entonces, en la salida, no aparecen títulos como se ve en el ejemplo siguiente:
SQL> /
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
SYSTEM 9887149C9890214A
SYS 4790272FCF800D71
ADMAUD A101B2757316EC78
SQL> /
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
SYSTEM 9887149C9890214A
SYS 4790272FCF800D71
ADMAUD A101B2757316EC78
4 rows selected.
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
SYSTEM 9887149C9890214A
SYS 4790272FCF800D71
ADMAUD A101B2757316EC78
4 rows selected.
Elapsed: 00:00:00.01
set pause on|off
Si está prendido (on), genera una pausa al iniciar la consulta y cada vez que se cumplan los n registros correspondientes al
comando set pagesize n. La pausa se “rompe” cuando se teclea [Enter].
set trimspool on|off
Cuando se prende, el exceso de espacios que usa SQL*Plus para rellenar hasta cumplir con los n caracteres usados en set linesize,
son eliminados dejando sólo hasta donde llega el último caracter.
Esto no se ve al momento de ver el resultado de una consulta, sin embargo al momento de generar un archivo con spool, se verán
los resultados de manera importante. Por ejemplo:
Configuro aquí el ancho de la línea a 1,000 caracteres, con lo cual, SQL*Plus rellenará con espacios hasta completarlos.
SQL> set linesize 1000
SQL> set pagesize 30000
Ahora, puedo generar un archivo de texto que llamaré file_1k_chars_raw.txt, con el resultado de una consulta a la
vista DBA_OBJECTS con todos los objetos del sistema:
SQL> spool file_1k_chars_raw.txt
SQL> select object_id,
2 object_name
3 from dba_objects;
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------------------
20 ICOL$
46 I_USER1
28 CON$
15 UNDO$
29 C_COBJ#
3 I_OBJ#
25 PROXY_ROLE_DATA$
...
15216 DBMS_NETWORK_ACL_UTILITY
15217 USER_NETWORK_ACL_PRIVILEGES
15218 USER_NETWORK_ACL_PRIVILEGES
15219 DBMS_NETWORK_ACL_ADMIN
15220 DBMS_NETWORK_ACL_UTILITY
15227 WRM$_DEEP_PURGE_INTERVAL
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------------------------------------------------------------------------------------
20 ICOL$
46 I_USER1
28 CON$
15 UNDO$
29 C_COBJ#
3 I_OBJ#
25 PROXY_ROLE_DATA$
41 I_IND1
54 I_CDEF2
...
15218 USER_NETWORK_ACL_PRIVILEGES
15219 DBMS_NETWORK_ACL_ADMIN
15220 DBMS_NETWORK_ACL_UTILITY
15227 WRM$_DEEP_PURGE_INTERVAL
Aunque ya está obsoleto el tipo de datos LONG, puede ser que alguna aplicación vieja aún lo use, y ciertamente, las vistas del
diccionario de datos de Oracle, lo siguen usando. Por ejemplo en la vista DBA_VIEWS:
SQL> desc dba_views
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
VIEW_NAME NOT NULL VARCHAR2(30)
TEXT_LENGTH NUMBER
TEXT LONG
TYPE_TEXT_LENGTH NUMBER
TYPE_TEXT VARCHAR2(4000)
OID_TEXT_LENGTH NUMBER
OID_TEXT VARCHAR2(4000)
VIEW_TYPE_OWNER VARCHAR2(30)
VIEW_TYPE VARCHAR2(30)
SUPERVIEW_NAME VARCHAR2(30)
EDITIONING_VIEW VARCHAR2(1)
READ_ONLY VARCHAR2(1)
Este tipo de datos es el precursor del CLOB (hasta 8TB), es decir, es un campo de caracteres muy grande (hasta 2GB). Por sí solo,
muestra unos cuantos caracteres al hacer un query:
SQL> select view_name,
2 text
3 from dba_views
4 where rownum < 3;
VIEW_NAME TEXT
------------------------------ --------------------------------------------------------------------------------------------------------------
STAR
Y con la corrección:
2 tabtype
3 from tab
4 where rownum <= 5;
TNAME TABTYPE
------------------------------ -------
ACCESS$ TABLE
ALERT_QT TABLE
ALL$OLAP2_AWS VIEW
ALL_ALL_TABLES VIEW
ALL_APPLY VIEW
TNAME TABTYPE
------------------------------ -------
ACCESS$ TABLE
ALERT_QT TABLE
ALL$OLAP2_AWS VIEW
ALL_ALL_TABLES VIEW
ALL_APPLY VIEW
set colsep ‘caracter(es)’
Con este comando, se puede configurar un delimitador entre las columnas mostradas en una consulta. Puede ser cualquier caracter o
conjunto de estos. Ejemplo con un pipe:
TNAME |TABTYPE
------------------------------|-------
ACCESS$ |TABLE
ALERT_QT |TABLE
ALL$OLAP2_AWS |VIEW
ALL_ALL_TABLES |VIEW
ALL_APPLY |VIEW
Y con un conjunto de espacios, se puede replicar algo similar al comando set space:
SQL> set colsep ' '
SQL> /
TNAME TABTYPE
------------------------------ -------
ACCESS$ TABLE
ALERT_QT TABLE
ALL$OLAP2_AWS VIEW
ALL_ALL_TABLES VIEW
ALL_APPLY VIEW
set underline ‘caracter’ | on | off
Algo similar a set colsep, pero sirve para configurar la línea que separa los títulos de las columnas de los valores de estas, puede ser
un caracter o simplemente apagar o prender dicha característica. Ejemplo con un signo de igual:
SQL> set underline '='
SQL> /
TNAME TABTYPE
============================== =======
ACCESS$ TABLE
ALERT_QT TABLE
ALL$OLAP2_AWS VIEW
ALL_ALL_TABLES VIEW
ALL_APPLY VIEW
Y quitando los caracteres apagando la característica :
TNAME TABTYPE
ACCESS$ TABLE
ALERT_QT TABLE
ALL$OLAP2_AWS VIEW
ALL_ALL_TABLES VIEW
ALL_APPLY VIEW
SUGERENCIA
----------
-410.58824
-388.23529
-157.57353
-51.011029
TB_AUD 500 496 4 .8
-495.29412
-492.94118
-442.05882
69.3382353
8 rows selected.
Para lograr que se vea de mejor forma, tendremos que darle un correcto formato a las columnas. Para esto, tenemos el comando:
an [word_wrapped] donde n es la longitud de caracteres que tendrá; la palabra word_wrapped, hace que los datos contenidos por
esta columna, sean recortados a la longitud asignada sin cortar las palabras, y cada línea es justificada a la izquierda sin espacios ni
caracteres como TAB.
Numérico:
9|0 con cualquiera de los dos, se reserva una posición para el número que aparecerá, con 9, se reserva un espacio en blanco, con 0
en vez de un espacio, se pone un 0 que ocupará la posición.; se pueden usar comas y puntos para delimitar las cifras.
Si por alguna razón, se reusa una columna que originalmente era caracter de tipo word_wrapped y después se cambia a númerico
con un formato con 0s y 9s, el número tendrá este último formato, pero justificado a la izquierda. Para evitar esto, hay que limpiar el
formato de la columna con la opción que se ve aquí después de los siguientes ejemplos.
Ejemplos:
SQL> /
8 rows selected.
SYSDATE
--------
15/09/08
SQL> /
SYSDATE
--------
15/09/08
SQL> /
SYSDATE
--------
15/09/08
SQL> /
SYSDATE
--------
15/09/08
Para desactivar los títulos, nada más se tienen que usar los comandos:
ttitle off
btitle off
Agregando espacio, subtotales…
Ahora, con las instrucciones break y compute, podemos agregar líneas en blanco para el resultado de las consultas, así como
calcular operaciones sobre alguna de las columnas. En el siguiente texto, muestro el formato de cada una de ellas:
break on columna
Sirve para determinar con base en cuál columna se hará un brinco.
compute función of columna1 on columna2
Este comando, nos permite aplicar una función a la columna1 de acuerdo al valor de la columna2. La función a aplicar será una de
las que aparecen a continuación:
SUM Calcula la suma de columna1.
MINIMUM Calcula el mínimo valor de columna1.
MAXIMUM Calcula el máximo valor de columna1.
AVG Calcula el promedio de columna1.
STD Calcula la desviación estándar de columna1.
VARIANCE Calcula la varianza de columna1.
COUNT Calcula la cantidad de registros NOT NULL de columna1.
NUMBER Calcula el número de registros de columna1.
Por ejemplo:
2 from tipo
4* order by programa
SQL> /
17 rows selected.
SQL> /
FALTA FAL
SALIDA SAL
CLIENTE CLIENTE EXCELENTE CAAA
CLIENTE BUENO CA
CLIENTE MALO CC
CLIENTE REGULAR CB
GERENTE GTE
CHOFER CHOF
DOWNY DOWNY
17 rows selected.
SQL> /
FALTA FAL
SALIDA SAL
******************** -----
count 3
CLIENTE BUENO CA
CLIENTE MALO CC
CLIENTE REGULAR CB
******************** -----
count 5
GERENTE GTE
CHOFER CHOF
******************** -----
count 3
******************** -----
count 4
DOWNY DOWNY
******************** -----
count 2
17 rows selected.
Para mostrar los valores para compute y para break, sólo se ejecutan los comandos sin ningún parámetro, Por ejemplo:
SQL> compute
SQL> break
Para limpiar los valores de cada uno de los comandos, se ejecutan las siguientes sentencias:
clear breaks
clear computes
Por ejemplo:
breaks cleared
computes cleared
SQL>
break on report
Para después, agregar como se vio en el punto anterior, un comando que calcule una función a nivel de reporte, en nuestro ejemplo,
usaré la suma como muestro en el comando siguiente:
Nota importante. Para que funcione este tipo de funciones, la columna a la que se le calculará la función, no debe ser la primera.
Poniendo en práctica lo que comento, vamos a ver un ejemplo:
2 from dba_objects
3* group by object_type;
OBJECT_TYPE CANTIDAD
-------------------- ----------
CONSUMER GROUP 5
INDEX PARTITION 80
SEQUENCE 93
QUEUE 19
SCHEDULE 1
TABLE PARTITION 72
RULE 1
PROCEDURE 49
OPERATOR 6
LOB PARTITION 1
WINDOW 2
LOB 120
PACKAGE 461
LIBRARY 113
RULE SET 9
PROGRAM 3
TYPE BODY 81
CONTEXT 1
TRIGGER 3
JOB CLASS 2
UNDEFINED 6
DIRECTORY 2
TABLE 856
INDEX 891
SYNONYM 2404
VIEW 2840
FUNCTION 65
WINDOW GROUP 1
CLUSTER 10
TYPE 940
RESOURCE PLAN 3
EVALUATION CONTEXT 7
JOB 6
----------
SUMA 9600
34 rows selected.
spool [directorio]nombre_archivo.extensión
comandos y resultados de información…
spool off
Donde directorio, será de acuerdo al sistema operativo con el que se esté trabajando. Si se omite éste dato, el archivo de generará en
el directorio de instalación de Oracle si se trabaja en windows, o en el directorio desde el cual, se ejecutó el sqlplus para linux o
unix.
Por ejemplo:
spool /home/oracle/datos.txt
USERNAME PASSWORD
------------------------------ ------------------------------
SALT 4195FE23CF28FA4E
SYSTEM 9887149C9890214A
SYS 4790272FCF800D71
ADMAUD A101B2757316EC78
spool off
Con esto, se generará un archivo llamado datos.txt en /home/oracle. Aquí, si se genera un registro con separación de tabuladores
entre datos y le ponemos una extensión .xls al archivo, lo podremos cargar muy facil en excel.
Conclusiones
Como se puede ver, es muy útil toda ésta información para poder presentar los resultados de las consultas ejecutadas. Los ejemplos
y formatos que muestro, son los que he usado en algún momento.
Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la
brevedad.