Site hosted by Angelfire.com: Build your free website today!

ACCESO A LOS DATOS DEL R.E.D. MEDIANTE SQL*PLUS



INDICE:

  1. INTRODUCCIÓN
    1. Introducción al SGBDR Oracle
    2. Ciclo de vida de una base de datos Oracle
  2. CONCEPTOS BÁSICOS
    1. Archivos Oracle
      1. Estructura física de la BD
      2. Estructura lógica
    2. El diccionario de datos
    3. Estructura de memoria y procesos Oracle
  3. SQL: COMANDOS BÁSICOS
    1. Visión rápida de SQL
      1. Desc
      2. Help
      3. Select
      4. Create
      5. Insert
      6. Delete
      7. Update
      8. Drop
    2. Formateo de salidas
    3. Edición de comandos buffer SQL
    4. Almacenamiento, ejecución e impresión de consultas
      1. Almacenamiento e impresión de las consultas
      2. Archivo, recuperación y ejecución de comandos SQL
    5. Transacciones
  4. EL COMANDO SELECT
    1. Uso general
    2. Filas sin información duplicada
    3. Uso de alias para las columnas
    4. Selección de filas en una tabla
    5. Selección de filas dentro de un margen
    6. Clasifiación de filas en una consulta
  5. UNIÓN DE TABLAS
    1. Introducción
    2. Especificación de las columnas de la unión
    3. Equi-uniones y no equi-uniones
    4. Uniones externas
  6. VALORES NUMÉRICOS
    1. Visualización de valores
    2. Expresiones aritméticas
    3. Funciones aritméticas
    4. Funciones de agrupación
  7. VALORES CARÁCTER
    1. Visualización de valores carácter
    2. Expresiones carácter
    3. Funciones carácter
    4. Constantes carácter
  8. VALORES NULOS Y VALORES FECHA
    1. Valores nulos
      1. Identificación de valores nulos
      2. Tratamiento de valores nulos
    2. Valores fecha
      1. Valores fecha. Formatos
      2. Operaciones con valores fecha
  9. SUBCONSULTAS
    1. Como se utilizan las subconsultas
    2. Subconsultas que dan un conjunto de valores. ANY Y ALL
    3. Subconsultas que dan una lista de valores. IN y NOT IN
    4. Subconsultas que dan más de una columna
    5. Subconsultas múltiples
    6. Subconsultas correlacionadas
    7. Subconsultas que comprueban una existencia
  10. CREACIÓN Y MODIFICACIÓN DE TABLAS
    1. Creación de tablas.El comando CREATE TABLE
    2. Modificación de tablas. El comando ALTER TABLE
  11. MODIFICACIÓN DE FILAS EN UNA TABLA
    1. Inserción de filas. El comando INSERT
    2. Copia de valores entre filas
    3. Actualización de campos
    4. Borrar filas
    5. Control de cambios
  12. CREACIÓN DE INFORMES
    1. Títulos
    2. Breaks
    3. Cálculo de totales en los breaks
  13. VISTAS
    1. Utilización de vistas
    2. Ejemplos de vistas
    3. Problema de vistas


INTRODUCCIÓN


CONCEPTOS BÁSICOS


SQL.COMANDOS BÁSICOS


EL COMANDO SELECT

Como hemos visto mediante el comando select podemos seleccionar columnas y filas de una tabla, de tal forma que nos permite acceder a la información contenida en la tabla de una forma 'selectiva'. Pasemos ahora a hacer un uso mas extensivo del comando:
Las columnas de una tabla se pueden selecionnar explícitamente: Antes de hacer el ejemplo estableceremos unos caracteres de pausa y pondremos activa la salida pausada.
	SQL> SET PAUSE "sigue..." 
	SQL> SET PAUSE ON         
Notar que los comandos de SQL*PLUS para manejo de salidas no tienen porque ir terminados con ';'. Una vez establecida la pausa en la salida, ejecutamos:
	SQL> SELECT NP, ASAL, MARCA FROM SOC91_;  
	sigue...                                  
                                          
	        NP       ASAL MARCA               
	---------- ---------- ------              
	 -99999922          5 1                   
	 -99999912         73 1                   
	 -99999797          9 1                   
	 -99999769        300 1                   
	 -99999743         79 14                  
	....
Al utilizar sentencias de SQL podemos utilizar varias líneas, de forma que el comando no acaba hasta que no encuentra un ';'.
                     
	SQL> select np,asal,v000          
	  2  from soc91_;                 
	sigue...                          
	                                  
	        NP       ASAL       V000  
	---------- ---------- ----------  
	 -99999922          5          0  
	 -99999912         73          0  
	...
Es posible mediante el comodín '*' dar salida a todas las columnas de la tabla:
SQL> select * from indice_;
sigue...
       NP      DH91 IAE91 C      SI91      DH92 IAE92 C      SI92      DH93 IAE93 C      S
--------- --------- ----- - --------- --------- ----- - --------- --------- ----
     DH94 IAE94 C      SI94 CIF        RAZON
--------- ----- - --------- ---------- -----------------------------------------
-99999999         0                 0         0                 0         0                 0
        1 9     A      1100 A          ACME   S.L.

-99999986         0                 0         0                 0         9 1833  B        12
        0                 0 B          ACME II S.A.
Al utilizar el comodín las columnas aparecen el el orden en el que se especificó al crear la tabla. Podemos apreciar como las filas se dividen en varias líneas, haciendo más difícil su lectura. El uso de el comodín '*' no siempre es posible ya que cuando hay muchas columnas, nos dara un desbordamiento de memoria:
	SQL> select * from soc91_;
	desbordamiento de memoria. Use el comando SET para reducir ARRAYSIZE o 	aumentar 
Para evitar el anterior error debemos disminuir el ARRAYSIZE que es el número de filas que oracle nos manda en un solo bloque (llamado batch), de forma que al disminuirlo necesitemos menos memoria. Por defecto este valor es 20 y no es conveniente cambiarlo ya que no tiene mucho sentido dar salida a filas muy largas. Para cambiar el valor de ARRAYSIZE se puede hacer de dos formas:
  1. Bien con el menú Options.. Set options
  2. Bien con el comando SET ARRAYSIZE n

Puede ocurrir que en una 'query' (consulta) deseemos no sacar valores repetidos, por ejemplo para ver los diferentes códigos de agrupaciones por actividad:
SQL> SELECT AGRUP FROM IAES;
	    AGRUP
	---------
	        1
	        1
	        1
	        1
	......
	        2
	        2
	        2
Como vemos si lo que queremos es ver los diferentes valores de la columna AGRUP, debemos utilizar la cláusula DISTINCT:
	SQL> SELECT DISTINCT AGRUP FROM IAES;
	    AGRUP
	---------
	        1
	        2
	        3
	        4
	        5
	        6
	        7
	        8
	        9
	       10
	       11
	       12
	       13
	       14
	
	14 filas seleccionadas.

Es posible cambiar el encabezamiento de una columna mediante el uso de un alias del nombre de la columna:
	SQL> SELECT NP NPUENTE,V049 EXPORTACIONES FROM SOC91_;
	  NPUENTE EXPORTACIONES
	--------- -------------
	-99999922             0
	-99999912     156380400
	-99999797             0
	......
Si el alias tiene espacios en blanco, lo pondremos entre comillas:
	SQL> SELECT NP "N. PUENTE",V001 "GASTOS ESTABLECIMIENTO" FROM SOC91_;
	N. PUENTE GASTOS ESTABLECIMIENTO
	--------- ----------------------
	-99999922                      0
	-99999912                      0
	-99999797                3814117
	.....
Como ya hemos visto anteriormente la cláusula WHERE del select permite seleccinar las filas, lo que comunmente se llama poner un filtro a la consulta. Para hacer esto la cláusula debe contar al menos con tres elementos:
  1. el nombre de la columna.
  2. el operador de comparación.
  3. un nombre de columna, una constante o bien una lista de valores.
Los operadores de comparación pueden ser:
Operadores de comparación
OperadorSignificado
=igual a
!= , ^= ó <>diferente de
>mayor
>=mayor o igual
<menor que
<=menor o igual
BETWEEN ...AND ..entre dos valores
IN (lista)existe en lista
LIKEse adapta a una estructura de caractes
IS NULLes un valor nulo (no 0)
SQL> SELECT * 
  2  FROM IAES
  3  WHERE AGRUP = 1;
            |    | |
            |    | ----> constante
            |    ------> operador de comparación|
            -----------> nombre de la columna
En el ejemplo anterior listariamos todos los códigos de iae para el código de agrupación 1. Cuando la columna es de tipo carácter la constante debe de ir entre comillas simples. Por ejemplo, si queremos saber la delegación de hacienda de todas las sociedades que declaran en el 92 con iae '4' introduciremos el siguiente comando:
	SQL> SELECT NP,IAE92,DH92
	  2  FROM INDICE_
	  3  WHERE IAE92='4';

	       NP IAE92      DH92
	--------- ----- ---------
	-99999685 4            26
	-99999416 4             1
	-99998630 4             1
	....
También podemos utilizar expresiones compuestas mediante OR y AND. De esta forma podemos conocer todas las sociedades con iae 4 (Actividades agrarias ....) y que no declararón en la dh 1:
	SQL> SELECT NP,IAE92,DH92
	  2  FROM INDICE_
	  3  WHERE IAE92='4' AND DH92<>1;

	       NP IAE92      DH92
	--------- ----- ---------
	-99999685 4            26
	-99998378 4            41
	-99996666 4             2
	.....
Entre los operadores lógicos NOT, AND y OR, existe la prioridad dada por el orden anterior. Para cambiar este orden es posible poner paréntesis de forma que:
	SQL> SELECT NP,IAE91,IAE92,DH91,DH92
	  2  FROM INDICE_
	  3  WHERE IAE91 != IAE92 AND (IAE91='4' OR DH91=1);
	
	       NP IAE91 IAE92      DH91      DH92
	--------- ----- ----- --------- ---------
	-99999545 9     Z             1         1

La consulta anterior nos da las sociedades cuyo iae cambia en los años 91 y 92 y, o bien declararón en la dh 1 en el 91 o bien su iae en el 91 erá el 4. Mediante el operador BETWEEN es posible seleccionar filas para un valor comprendido dentro de un margen. Por ejemplo si deseamos saber aquellas sociedades del año 91 cuya declaración de exportaciones (v049) se encuentra entre 10 y 20 millones:
	SQL> SELECT NP, V049 EXPORTACIONES
	  2  FROM SOC91_
	  3  WHERE V049 BETWEEN 10000000 AND 20000000;
	
	       NP EXPORTACIONES
	--------- -------------
	-99999443      11290018
	-99996693      15151838

Esta misma consulta tambien la podriamos hacer aplicando otros operadores de comparación:
	SQL> SELECT NP, V049 EXPORTACIONES
	  2  FROM SOC91_
	  3  WHERE NOT (V049 < 10000000 OR V049 > 20000000);
	
Si lo que deseamos es negar el operador BETWEEN le podemos anteponer NOT. Si queremos seleccionar filas en las que el valor de un campo se encuentre dentro de una lista de valores se utiliza el operador IN. De esta forma seleccionar las sociedades con iae 'Z' o bien '9' se hará:
	SQL> SELECT NP,IAE91 "IAE del 91 Z o 9"
	  2  FROM INDICE_
	  3  WHERE IAE91 IN ('Z','9');
	
	       NP IAE d
	--------- -----
	-99999578 Z
	-99999545 9
	-99999443 Z
	....
De análoga manera para buscar aquellos valores que no estan la lista anteponemos el operador NOT a IN.

Veamos ahora como buscar valores de columnas carácter con el operador LIKE. Para ello el operador toma una cadena entre comillas simples en la cuál pueden existir los carácteres comodines:

SímboloSignificado
%cualquier secuencia de cero o más caracteres.
_un sólo carácter, cualquiera.

Como ejemplo veamos todos los iaes en cuya descripción existe la palabra 'Electri':

SQL> SELECT DES FROM IAES
  2  WHERE DES LIKE '%Electri%';

DES
--------------------------------------------------------------------------------
Produccion, Transporte Y Distribucion De Energia Electrica
Fabricacion De Herramientas Y Articulos Acabados En Metales, Con Exclusion De Ma
Fabricacion De Hilos Y Cables Electricos

Se puede ordenar las filas devueltas por una consulta en función de uno o varios campos, en orden ascendente o descendente e incluyendo los valores nulos con la cláusula ORDER BY. La cláusula ORDER BY debe se la última en una sentencia SELECT. El orden por defecto es ascendente. Veamos ahora dos ejemplos de ordenación por uno y varios campos:
	SQL> SELECT NP,ASAL FROM SOC91_
	  2  ORDER BY ASAL;
	
	       NP      ASAL
	--------- ---------
	-99998702         0
	-99998133         0
	.....
	-99999075         1
	-99997356         1
	.....
	-99996866         2
	-99996704         2
La consulta anterior nos ordenara la salida en función del número de asalariados en orden ascendente (por defecto). Si lo que deseamos es ordenar por varios campos, por ejemplo por asal y para los mismos asalariados por exportaciones:
	SQL> SELECT NP, ASAL,V049 EXPORTACIONES FROM SOC91_
	  2  ORDER BY ASAL, V049 DESC;
	
	       NP      ASAL EXPORTACIONES
	--------- --------- -------------
	-99998702         0             0
	-99998133         0             0
	.....
	-99996693         2      15151838
	-99996866         2             0
	.....
	-99998318         3             0
	-99996587         3             0
	.....
El campo por el que se ordena no es obligatorio que sea una columna de la consulta.

No hay que usar la cláusula ORDER BY en tablas muy grandes ya que Oracle al ordenar tomará lo que se llama segmentos temporales (espacio en disco para ordenaciones intermedias), provocando una mayor lentitud en el comando así como que posiblemente el usuario no tenga permisos para ese tipo de operaciones y se provoque el error:

	ERROR:                                                                 
	ORA-01652: unable to extend temp segment by 1024 in tablespace TEMP    
De esta forma si se deseea hacer ordenaciones de tablas muy grandes lo mejor es que consulte con el administrador de la base de datos.

UNIÓN DE TABLAS


VALORES NUMÉRICOS


VALORES CARACTER


VALORES NULOS Y VALORES FECHA


SUBCONSULTAS


CREACIÓN Y MODIFICACIÓN DE TABLAS

MODIFICACIÓN DE FILAS EN UNA TABLA


CREACIÓN DE INFORMES

En SQL*PLUS es posible utilizar comandos específicos para mejorar la salida de nuestras consultas. Estos comandos no serán muy necesarios ya que podemos flexibilizar el aspecto de la salida final importando la consulta en una hoja de cálculo. Veamos algunos de estos comandos:

  • TITULOS

    Podemos poner títuloos al principio y final de cada página de nuestra consulta con TTITLE (encabezado de página) y BTITLE (pie de página), ajustándolos a la izquierda, centro o derecha.
    SQL> TTITLE LEFT 'EJEMPLO DE TITULO IZDA.' SKIP COL 6 'AHORA UNA LINEA ABAJO Y E
    MPEZANDO EN COLUMNA 6.'
    SQL> BTITLE COL 5 'TITULO DE PIE DE PAGINA'
    SQL> SELECT NP,ASAL FROM SOC92_;
    
    EJEMPLO DE TITULO IZDA.
         AHORA UNA LINEA ABAJO Y EMPEZANDO EN COLUMNA 6.
           NP      ASAL
    --------- ---------
    -99999824         2
    -99999797         7
    .......
    -99998378        68
    -99998318         4
        TITULO DE PIE DE PAGINA
    
    Al igual que LEFT podemos usar CENTER o RIGHT. Si en un título queremos saltar líneas utilizamos SKIP n , donde n es el número de líneas a saltar.
    Para cancelar/activar los títulos anteriores:
    	TTITLE OFF 
    	BTITLE OFF
    	TTITLE ON
    	BTITLE ON
    

    Y para consultar los activos basta con el comando TTITLE sin ningún argumento.

  • BREAKS

    A la hora de formatear informes es posible realizar tareas en el cambio de:
    • una o varias columnas.
    • página.
    • informe.

    Por ejemplo imaginemos que queremos separar la salida de los gastos de personal para sociedades del 91 de tal manera que cuando cambie la delegación de hacienda se produzca un salto de página:

    SQL> BREAK ON DH91 SKIP 1
    SQL> SELECT DH91, V033 GP
      2  FROM INDICE_,SOC91_
      3  WHERE INDICE_.NP=SOC91_.NP
      4  ORDER BY DH91;
    
    EJEMPLO DE TITULO IZDA.
         AHORA UNA LINEA ABAJO Y EMPEZANDO EN COLUMNA 6.
         DH91        GP
    --------- ---------
            1  63411840
              147294368
              133280032
    .....
              133280032
    
            2  29357170
              150820192
              1,003E+09
    .....
        TITULO DE PIE DE PAGINA
    
    En el ejemplo anterior vemos como al estar ordenado por delegación, cada vez que esta cambia se produce un salto de línea. Además observamos que el campo DH91 no se repite, solo aparece en la primera fila de su grupo.
    Si deseamos que se visualizen repetidamente las delegaciones de hacienda utilizamos:
    	BREAK ON DH91 SKIP 1 DUPLICATES
    
    Para cancelar los BREAKS establecidos:
    	CLEAR BREAKS
    
    y para ver los actuales:
    	BREAK
    

  • CÁLCULO DE SUBTOTALES EN LOS BREAKS

    Se pueden calcular sumas parciales de una o más columnas cada vez que aparece un BREAK. Por ejemplo:
    SQL> BREAK ON DH91 SKIP 1
    SQL> COLUMN GP FORMAT 999,999,999 HEADING 'GASTOS DE PERSONAL'
    SQL> COMPUTE SUM OF GP ON DH91
    SQL> SELECT DH91, V033 GP
      2  FROM INDICE_,SOC91_
      3  WHERE INDICE_.NP=SOC91_.NP
      4  ORDER BY DH91;
    
    EJEMPLO DE TITULO IZDA.
         AHORA UNA LINEA ABAJO Y EMPEZANDO EN COLUMNA 6.
         DH91 GASTOS DE PERSONAL
    --------- ------------------
            1         63,411,840
                     147,294,368
                      61,398,624
    .....
                     503,614,528
                      68,657,408
                      54,844,844
    ********* ------------------
    sum             ############
    
            2             57,417
                       5,528,840
                     167,947,600
    ....
    
    En el ejemplo anterior vemos como el formateo de la columna no es suficientemente grande como para almacenar la suma y hay que ampliarlo.

    Al igual que antes hemos hecho la suma es posible hacer cálculos de:

    	COMPUTE MIN OF ....
    	COMPUTE MAX OF ....
    	COMPUTE AVG OF ....
    	COMPUTE STD OF ....
    	COMPUTE VAR OF ....
    	COMPUTE COUNT OF ....
    
    Para ver los 'COMPUTE' que están activados:
    	SQL> COMPUTE
    
    Para borrar los 'COMPUTE':
    	SQL> CLEAR COMPUTES
    

VISTAS DE UNA TABLA

Una vista es como una ventana a través de la cual se puede ver o modificar parte de la información de una tabla ó varias tablas.Aunque las vistas no contienen datos por sí mismas,parecen tablas y,con algunas restricciones,pueden tratarse como tales.Podemos entender una vista como una consulta almacenada ó una tabla virtual.

Existen varias razones para el uso de vistas:

  1. Seguridad.La información contenida en ciertas columnas de una ó varias tablas puede ser confidencial.Una vista puede aumentar el nivel de seguridad restingiendo el acceso a un determinado conjunto de filas y/ó columnas.
  2. Simplicidad.Cuando las tablas son complejas,el acceso a cierta información supone realizar consultas complicadas.Las vistas facilitan este acceso, facilitando las consultas.Por ejemplo,las vistas permiten seleccionar varias columnas de diferentes tablas sin necesidad de saber como hay que hacer la unión entre las mismas,realizar cálculos intensivos sobre las columnas de una tabla ó presentar los datos con una perspectiva diferente,renombrando columnas,etc.
  3. Funcionalidad.Una vista puede servirnos para realizar consultas que no pueden ser hechas sobre las tablas base.Por ejemplo,una vista puede ser definida con un GROUP BY en una consulta que contenga la unión de una vista con otra tabla.

    Asimismo,una vista nos permite salvar aplicaciones de los cambios hechos en las tablas base.Por ejemplo,si una vista hace referencia a una consulta sobre tres columnas de una tabla y una cuarta columna es añadida a la tabla,la definición de la vista no es afectada y las aplicaciones basadas en la misma tampoco.

Para crear un vista utilizamos CREATE VIEW

CREATE VIEW nombre_vista [( col1,.....)]

AS consulta;

Se puede utilizar cualquier tipo de consulta para CREATE VIEW escepto las que contengan la cláusula ORDER BY.También se puede definir una vista en términos de otra vista.

  • UTILIZACION DE VISTAS

    Una vez creada la vista,podemos hacer consultas de la misma como si fuera una tabla.Podemos unir una vista con tablas ó con otras tablas.

    Cuando se crea una vista,es posible utilizar expesiones o funciones dentro de la consulta que la define.Estas expresiones aparecen como columnas en la vista,pero los valores de sus campos se calculan en base a la tablas origen cada vez que se consulta la vista.Estas columnas se denominan columnas virtuales y se les puede dar un nombre de forma explícita ( con el comando CREATE VIEW ) ó de forma implícita con un alias.

    Los cambios en las tablas se transmiten automáticamente a las vistas.Por ello,si se altera la estructura original de una tabla,no podemos asegurar que la vista responda correctamente.Esto se debe a que,cuando se crea la vista,la estructura de la tabla ó tablas origen entran a formar parte de la definición de la misma.Para resolver este problema podemos :

    1. Listar cada columna de la tabla en la definición de la vista en lugar de utilizar " SELECT *".De esta forma,si se añade una columna a la tabla,la vista no se modifica.
    2. Anular la vista y volver a crear otra después de modificar la tabla.Para borrar una vista utilizamos el comando DROP VIEW nombre_vista.

  • EJEMPLOS

    1.- Creación de vistas.

    CREATE VIEW  wivaret92(np,iae,sector,ventas,asal,salario)
    AS SELECT i.np,i.iae92,sector,iv.v000+iv.v002+iv.v004+iv.v016+iv.v017+iv.v022,
    NVL(r.v000,0),NVL(r.v001,0)
    FROM iaes ia,indice_ i,ret92_ r,iva92_ iv
    WHERE i.np=iv.np AND iv.np=r.np(+) AND substr(i.iae92,1,4)=ia.iae;
    
    Creamos una vista que une las tablas indice_,iaes,iva92_ y ret92_.
    CREATE VIEW wsectasal92(sector,ventas,empasal,asal,salario)
    AS SELECT sector,SUM(iv.v000+iv.v002+iv.v004+iv.v016+iv.v017+iv.v022),
    COUNT(r.v000),SUM(NVL(r.v000,0)),SUM(NVL(r.v001,0))
    FROM iaes ia,indice_ i,ret92_ r,iva92_ iv
    WHERE i.np=iv.np AND iv.np=r.np(+) AND substr(i.iae92,1,4)=ia.iae
    GROUP BY sector;
     
    Utilizamos la cláusula GROUP BY para agrupar por sector.

    2.-Utilización de vistas

    SELECT sector,asal,DECODE(asal,0,0,ventas/asal) vpe FROM wsectasal92
    SORT BY vpe DESC;
    
    Vemos las ventas por empleado por sectores ordenadas en orden descendente.
    SELECT  v.np,sector,asal,salario,v000 asal91,v001 sal91
    FROM wivaret92 v,ret91_ r
    WHERE v.np=r.np(+) AND v00 IS NOT NULL  AND asal > 100;
    
    Unimos una vista con una tabla.El resultado son 22 filas seleccionadas.
    DROP VIEW wsectasal92
    
    Borramos la vista wsectasal92.
  • PROBLEMA:

    Para el año 92,obtener el número puente,sector y ratio ventas/asal(VPE) de aquellas empresas madrileñas cuyo salario medio fue superior al salario medio del año 91 de su sector( tomando el sector del año 92).

atras