Sunteți pe pagina 1din 17

Captulo 7: PARA IR MS LEJOS CON SQL

A. Carga de datos masivos con Sql loader.................................................................2


B. La importaciones y expotaciones de tablas con Oracle.........................................3
B.1.

Las Exportaciones de tablas...........................................................................3

B.2.

La importacin de tablas................................................................................4

C. Los sub-SELECT..................................................................................................4
D. Algunas conceptos de rendimiento........................................................................6
D.1. Optimizacin de las consultas mediante la utilizacin de HINTS ...........8
E. Presentacin de SQLPLUS...................................................................................9

F.

E.1.

El comando SPOOL.......................................................................................9

E.2.

El comando SET............................................................................................9

E.3.

La utilizacin de variables en Sql*Plus.......................................................10

Presentacin de los TRIGGER............................................................................10


F.1.

Creacin de un TRIGGER de control + actualizacin en una tabla.............11

F.2.

Creacin de un TRIGGER despus de las actualizaciones..........................12

G. Algunos scripts tiles..........................................................................................13


G.1. Tamao real de una columna........................................................................14
G.2. Buscar y eliminar duplicados en una tabla...................................................14
G.3. Extraer los datos de una tabla en un fichero plano......................................14
G.4. Generar un SELECT de todas las columnas de una tabla sin conocer su
estructura.................................................................................................................15
G.5. Generar comandos de insercin en una tabla a partir de un fichero Excel. .15
G.6. Procedimiento almacenado para eliminar filas en una tabla........................17

Lenguaje SQL

Pgina 1 de 17

Captulo 7: PARA IR MS LEJOS CON SQL

Carga de datos masivos con Sql loader


Ejemplo de un fichero
carga_peliculas.csv

de

control

para

un

fichero

con

separadores:

LOAD DATA
INFILE 'Carga_peliculas.csv'
BADFILE 'Carga_peliculas.csv.bad'
DISCARDFILE 'Carga_peliculas.dsc'
DISCARDMAX 999
TRUNCATE
INTO TABLE PELICULAS
FIELDS TERMINATED BY ','
(IDENT_PELICULAS,TITULO,GENERO1,GENERO2,
FECHA_ESTRENO,PAIS,IDENT_DIRECTOR ,DISTRIBUIDOR,SINOPSIS)

Sintaxis de ejecucin del sqlloader

sqlldr data=Carga_peliculas.csv control=Carga_peliculas.ctl


log=Carga_peliculas.log
bad=Carga_peliculas.bad
discard=Carga_peliculas.dsc
userid=user/passwd>

Ejemplo de un fichero
carga_peliculas_fija.csv

de

control

con

posicin

LOAD DATA
INFILE 'Carga_peliculas_fija.csv'
BADFILE 'Carga_peliculas_fija.csv.bad'
DISCARDFILE 'Carga_peliculas_fija.dsc'
DISCARDMAX 999
TRUNCATE
INTO TABLE PELICULAS
(IDENT_PELICULAS
POSITION ( 1 : 1 )
TITULO
POSITION ( 2 : 32 )
GENERO1
POSITION ( 33 : 40 )
GENERO2
POSITION ( 41 : 50 )
FECHA_ESTRENO
POSITION ( 51 : 58 )
"TO_DATE(:FECHA_ESTRENO,'DD/MM/YY')",
PAIS
POSITION ( 59 : 59 )
IDENT_DIRECTOR
POSITION ( 60 : 60 )
DISTRIBUIDOR
POSITION ( 61 : 77 )
SINOPSIS
POSITION ( 78 : 239)

Lenguaje SQL

de

inicio

de

INTEGER EXTERNAL,
CHAR,
CHAR,
CHAR,
INTEGER EXTERNAL,
INTEGER EXTERNAL,
CHAR,
CHAR)

Pgina 2 de 17

fin:

Captulo 7: PARA IR MS LEJOS CON SQL


sqlldr data= Carga_peliculas_fija.csv
control=Carga_peliculas_fija.ctl
log=Carga_peliculas_fija.log bad=Carga_peliculas_fija.bad
discard=Carga_peliculas_fija.dsc userid=user/passwd

La importaciones y exportaciones de tablas con Oracle


Las Exportaciones de tablas
Sintaxis Oracle para exportar la tabla Pelculas:
exp <usuario/contrasea> file=PELICULAS.dmp TABLES=PELICULAS
LOG=PELICULAS.log

Tambin se pueden aadir condiciones a la exportacin. Por ejemplo, si solo


queremos las pelculas cuyo identificador sea > 3, aadiremos la clusula QUERY:
exp <usuario/contrasea> file=PELICULAS.dmp TABLES=PELICULAS
LOG=PELICULAS.log
query="'where IDENT_PELICULAS > 3'

La exportacin slo ha extrado 2 filas


Preparado para exportar las tablas especificadas ... a travs de
la ruta directa ...
. . exportacin de la tabla PELICULAS
2 filas exportadas
<

Tambin es posible exportar toda la base de datos aadiendo la opcin FULL=Y.


Esta opcin est reservada al administrador de la base de datos

exp <usuario/contrasea> file=TODALABASE.dmp LOG=TODALABASE.log


full=y

Por ltimo, es posible poner todos los parmetros de la exportacin en un fichero


de parmetros de esta forma:
exp parfile=param_carga_peliculas.prm

Sintaxis MySql para exportar la tabla Pelculas:

Lenguaje SQL

Pgina 3 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


mysqldump -h<nombre o direccin de mquina, por defecto localhost>
-u
<usuario> -p<contrasea> -rPELICULAS.dmp <nombre base> PELICULAS

En MySql tambin es posible extraer toda la base de datos sin indicar ningn
nombre de tabla.
mysqldump -h<nombre o direccin de mquina, por defecto localhost>
-u <usuario> -p<contrasea> <nombre base de datos> >TODALABASE.dmp

La importacin de tablas
Ejemplo de importacin para una base de datos Oracle

imp <usuario/contrasea > file=PELICULAS.dmp TABLES=PELICULAS


LOG=IMPORTPELICULAS.log FROMUSER=<usuario> TOUSER=<usuario>

Ejemplo de importacin para una base de datos MySql

mysql - hlocalhost -u <usuario> -p<contrasea> <Nombre base de


datos>< PELICULAS.dmp

Los sub-SELECT

SELECT SUBSTR(PELICULAS.TITULO,1,20) TITULO,


PELICULAS.FECHA_ESTRENO,
SUBSTR((DIRECTOR.APELLIDO||' '||DIRECTOR.NOMBRE),1,25)
DIRECTOR,
SUBSTR(RTRIM(ACTOR.APELLIDO||' '||ACTOR.NOMBRE),1,25)
ACTOR,
ACTOR.FECHA_NACIMIENTO NACIDO,ACTOR.NUM_PELICULAS
NUM_PELICULAS,
ESTA.PRESUPUESTO,ESTA.NUM_ENTRADAS_ESPANA NUM_ENTRADAS
FROM
PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST,
ACTOR ACTOR, ESTADISTICA ESTA
WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND

Lenguaje SQL

Pgina 4 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


CAST.IDENT_ACTOR
ACTOR.NACIONALIDAD
WHERE

= ACTOR.IDENT_ACTOR AND
= (SELECT PAIS.IDENT_PAIS FROM PAIS

PAIS.DESCRIPCION = 'FRANCIA')
ORDER BY PELICULAS.TITULO, ACTOR.APELLIDO;

Para recuperar la descripcin del pas sin hace una unin, podemos escribir la
consulta del siguiente modo.
SELECT SUBSTR(PELICULAS.TITULO,1,20) TITULO,
PELICULAS.FECHA_ESTRENO,
SUBSTR((DIRECTOR.APELLIDO||' '||DIRECTOR.NOMBRE),1,25)
DIRECTOR,
SUBSTR(RTRIM(ACTOR.APELLIDO||' '||ACTOR.NOMBRE),1,25)
ACTOR,
ACTOR.FECHA_NACIMIENTO NACIDO,ACTOR.NUM_PELICULAS
NUM_PELICULAS,
ESTA.PRESUPUESTO,ESTA.NUM_ENTRADAS_ESPANA NUM_ENTRADAS,
(SELECT PAIS.DESCRIPCION FROM PAIS WHERE PAIS.IDENT_PAIS =
ACTOR.NACIONALIDAD) PAIS
FROM
PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST,
ACTOR ACTOR, ESTADISTICA ESTA
WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACTOR.IDENT_ACTOR
ORDER BY PELICULAS.TITULO, ACTOR.APELLIDO;

Si ahora la subconsulta devuelve varias ocurrencias, se puede utilizar en una


clusula IN. Si se buscan los actores americanos o argelinos, escribiremos la
siguiente consulta.
Ejemplo:
SELECT SUBSTR(PELICULAS.TITULO,1,20) TITULO,
PELICULAS.FECHA_ESTRENO,
SUBSTR((DIRECTOR.APELLIDO||' '||DIRECTOR.NOMBRE),1,25)
DIRECTOR,
SUBSTR(RTRIM(ACTOR.APELLIDO||' '||ACTOR.NOMBRE),1,25)
ACTOR,
ACTOR.FECHA_NACIMIENTO NACIDO,ACTOR.NUM_PELICULAS
NUM_PELICULAS,
ESTA.PRESUPUESTO,ESTA.NUM_ENTRADAS_ESPANA NUM_ENTRADAS
FROM
PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST,
ACTOR ACTOR, ESTADISTICA ESTA
WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACTOR.IDENT_ACTOR AND
ACTOR.NACIONALIDAD IN (SELECT PAIS.IDENT_PAIS FROM PAIS WHERE
PAIS.DESCRIPCION IN ('USA', 'ALGERIE'))
ORDER BY PELICULAS.TITULO, ACTOR.APELLIDO;

Lenguaje SQL

Pgina 5 de 17

Captulo 7: PARA IR MS LEJOS CON SQL

La misma consulta anterior pero con la clusula EXISTS en lugar de la clusula IN


devuelve el mismo resultado.

SELECT SUBSTR(PELICULAS.TITULO,1,20) TITULO,


PELICULAS.FECHA_ESTRENO,
SUBSTR((DIRECTOR.APELLIDO||' '||DIRECTOR.NOMBRE),1,25)
DIRECTOR,
SUBSTR(RTRIM(ACTOR.APELLIDO||' '||ACTOR.NOMBRE),1,25)
ACTOR,
ACTOR.FECHA_NACIMIENTO NACIDO,ACTOR.NUM_PELICULAS
NUM_PELICULAS,
ESTA.PRESUPUESTO,ESTA.NUM_ENTRADAS_ESPANA NUM_ENTRADAS
FROM
PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST,
ACTOR ACTOR, ESTADISTICA ESTA
WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACTOR.IDENT_ACTOR AND
EXISTS (SELECT PAIS.IDENT_PAIS FROM PAIS WHERE
PAIS.DESCRIPCION IN ('USA', 'ALGERIE') AND
PAIS.IDENT_PAIS = ACTOR.NACIONALIDAD )
ORDER BY PELICULAS.TITULO, ACTOR.APELLIDO;

Otra posibilidad, las subconsultas con la misma tabla que la tabla principal. Por
ejemplo si se quieren mostrar los actores que tienen el mismo nombre que otro
actor.
SELECT SUBSTR(PELICULAS.TITULO,1,20) TITULO,
PELICULAS.FECHA_ESTRENO,
SUBSTR((DIRECTOR.APELLIDO||' '||DIRECTOR.NOMBRE),1,25)
DIRECTOR,
SUBSTR(RTRIM(ACT1.APELLIDO||' '||ACT1.NOMBRE),1,25) ACTOR,
ACT1.FECHA_NACIMIENTO NACIDO,ACT1.NUM_PELICULAS
NUM_PELICULAS,
ESTA.PRESUPUESTO,ESTA.NUM_ENTRADAS_ESPANA NUM_ENTRADAS
FROM
PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST,
ACTOR ACT1, ESTADISTICA ESTA
WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACT1.IDENT_ACTOR AND
EXISTS (SELECT * FROM ACTOR ACT2 WHERE ACT2.NOMBRE =
ACT1.NOMBRE AND ACT2.APELLIDO <> ACT1.APELLIDO)
ORDER BY PELICULAS.TITULO, ACT1.APELLIDO;

Algunas conceptos de rendimiento


Lenguaje SQL

Pgina 6 de 17

Captulo 7: PARA IR MS LEJOS CON SQL

DELETE FROM PLAN_TABLE WHERE ESTAEMENT_ID='PRUEBA-REND';


EXPLAIN PLAN SET ESTAEMENT_ID='PRUEBA-REND' INTO PLAN_TABLE FOR
SELECT TL.FECHA_COMPRA,
TL.TIPO,
TT.DESC_TIPO,
TL.MARCA,
MT.DESC_MARCA,
TL.COLOR
FROM TELEFONO TL,
TIPO_TEL TT,
MARCA_TEL MT
WHERE TL.TIPO = TT.TIPO
AND TL.MARCA = MT.MARCA
AND TL.COLOR IN ('ROJO', 'BLANCO');

Ejemplo de seleccin en la tabla PLAN_TABLE:


SET LINES 132
SET PAGES 50
SET LONG 500
COL PLAN FOR A45
COL AUTRE FOR A85 WRAP
SELECT OBJECT_NAME,OPERATION||' '||OPTIONS||' '||OBJECT_NAME
||' '||DECODE(ID,0,'COST = '||POSITION) PLAN
FROM PLAN_TABLE WHERE ESTAEMENT_ID = 'PRUEBA-REND';

o
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Para mostrar la estructura, los ndices y las restricciones de una tabla con
SQLPLUS, se puede utilizar este tipo de script
SET FLU OFF
SET PAGESIZE 255
SET WRAP OFF
SET VER OFF
SET ARRAYSIZE 1
COL TIPO FORMAT A15
COL NOT_NULL FORMAT A8
PROMPT .
PROMPT .-------------------------.
PROMPT ESTRUCTURA DE LA TABLA TELEFONO :
PROMPT .----------------------------.
PROMPT .
SELECT UPPER(A.COLUMN_NAME) NOM,A.DATA_TIPO || '(' ||
DECODE(A.DATA_TIPO,'NUMBER',A.DATA_PRECISION,
A.DATA_LENGTH) || ')' TIPO,
DECODE(A.NULLABLE,'N','
N','') NOT_NULL,

Lenguaje SQL

Pgina 7 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


B.COMMENTS COMENTARIO
FROM USER_TAB_COLUMNS A, USER_COL_COMMENTS B
WHERE A.TABLE_NAME = 'TELEFONO'
AND
B.TABLE_NAME = 'TELEFONO'
AND
A.TABLE_NAME = B.TABLE_NAME
AND
A.COLUMN_NAME = B.COLUMN_NAME
ORDER BY A.COLUMN_ID;
PROMPT .
PROMPT .-------------------------.
PROMPT INDICES DE LA TABLA TELEFONO:
PROMPT .----------------------------.
PROMPT .
SELECT INDEX_NAME "INDEX",
LOWER(COLUMN_NAME) "COLUMNA(S)"
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = UPPER('TELEFONO')
ORDER BY INDEX_NAME, COLUMN_POSITION;
PROMPT .
PROMPT .-------------------------.
PROMPT CLAVES FORANEAS QUE REFERENCIA LA TABLA 'TELEFONO':
PROMPT .-------------------------.
PROMPT .
SELECT B.CONSTRAINT_NAME "CLAVES FORANEAS",
LOWER(B.TABLE_NAME) "TABLE"
FROM USER_CONSTRAINTS A, USER_CONSTRAINTS B
WHERE A.TABLE_NAME = 'TELEFONO'
AND A.CONSTRAINT_NAME = B.R_CONSTRAINT_NAME;

Creacin de un ndice en la tabla TELEFONO


CREATE INDEX I_COLOR ON TELEFONO (COLOR);

Optimizacin de las consultas mediante la utilizacin de


HINTS
Ahora, si se quiere utilizar el ndice I_TIPO, se puede escribir la consulta de este
modo:
SELECT /*+ INDEX(TELEFONO I_TIPO) */
FECHA_COMPRA,
TIPO,
MARCA,
COLOR
FROM TELEFONO WHERE TIPO ='SP';

En algunos casos, puede ser conveniente realizar un ACCESS FULL


aunque Oracle utilice un ndice.
Lenguaje SQL

Pgina 8 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


En este caso escribiremos:
SELECT /*+ FULL(TELEFONO) */
FECHA_COMPRA,
TIPO,
MARCA,
COLOR
FROM TELEFONO WHERE TIPO ='SP';

Presentacin de SQLPLUS
El comando SPOOL
Es posible redirigir el resultado de todo lo que se ejecuta en pantalla. Para ello hay
que utilizar el comando SPOOL.
Ejemplo:
SPOOL Fichero_Lista_Peliculas;
SELECT PELICULAS.TITULO, PELICULAS.FECHA_ESTRENO,
DIRECTOR.APELLIDO, ACTOR.APELLIDO, ACTOR.FECHA_NACIMIENTO,
ESTA.PRESUPUESTO
FROM PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST, ACTOR
ACTOR, ESTADISTICA ESTA WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACTOR.IDENT_ACTOR
ORDER BY PELICULAS.TITULO, ACTOR.NOM DESC;
SPOOL OFF;

El comando SET

Muestra por defecto todos los nmeros con el signo $ delante y un punto
entre los miles de millones, los millones y los miles.
Ejemplo de utilizacin:
SELECT PELICULAS.TITULO, PELICULAS.FECHA_ESTRENO,
SUBSTR(DIRECTOR.APELLIDO||' '||DIRECTOR.NOMBRE,1,30)
DIRECTOR,ESTA.RECAUDACION_USA,ESTA.RECAUDACION_MUNDIAL
FROM PELICULAS PELICULAS, DIRECTOR DIRECTOR, ESTADISTICA ESTA WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS
ORDER BY PELICULAS.TITULO;

Lenguaje SQL

Pgina 9 de 17

Captulo 7: PARA IR MS LEJOS CON SQL

Si se aplica algn SET en el ejemplo anterior, se puede llegar a formatear


un resultado que pueda utilizar Excel.
SELECT PELICULAS.TITULO, PELICULAS.FECHA_ESTRENO,
DIRECTOR.APELLIDO, ACTOR.APELLIDO,ACTOR.FECHA_NACIMIENTO,
ESTA.PRESUPUESTO
FROM PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST, ACTOR
ACTOR,
ESTADISTICA ESTA WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACTOR.IDENT_ACTOR
ORDER BY PELICULAS.TITULO, ACTOR.NOM DESC;
SET LINE 200
SET COLSEP ';'
SET HEAD OFF
SET NUM 9
SET TRIMSPOOL ON
SET PAGE 3000
SPOOL Fichero_Lista_Peliculas;
/
SPOOL OFF;

La utilizacin de variables en Sql*Plus


Aqu puede ver un ejemplo en el que se pide desde qu fecha se deben seleccionar
las pelculas.
SELECT PELICULAS.TITULO, PELICULAS.FECHA_ESTRENO,
DIRECTOR.APELLIDO, ACTOR.APELLIDO,ACTOR.FECHA_NACIMIENTO,
ESTA.PRESUPUESTO
FROM PELICULAS PELICULAS, DIRECTOR DIRECTOR, CASTING CAST, ACTOR
ACTOR, ESTADISTICA ESTA
WHERE
PELICULAS.IDENT_DIRECTOR = DIRECTOR.IDENT_DIRECTOR AND
PELICULAS.IDENT_PELICULAS = CAST.IDENT_PELICULAS AND
PELICULAS.IDENT_PELICULAS = ESTA.IDENT_PELICULAS AND
CAST.IDENT_ACTOR
= ACTOR.IDENT_ACTOR AND
PELICULAS.FECHA_ESTRENO > TO_DATE('&FECHA_MIN','DD/MM/YYYY')
ORDER BY PELICULAS.TITULO, ACTOR.APELLIDO DESC;

Presentacin de los TRIGGER


Por ejemplo, si se quiere impedir que los usuarios borren una fila de la tabla
PELICULAS, se escribir:
Lenguaje SQL

Pgina 10 de 17

Captulo 7: PARA IR MS LEJOS CON SQL

SET SERVEROUTPUT ON
CREATE OR REPLACE TRIGGER T_BOR_PELICULAS
BEFORE DELETE
ON PELICULAS
FOR EACH ROW
DECLARE
BEGIN
DBMS_OUTPUT.PUT_LINE( 'No puede eliminar PELICULAS') ;
DBMS_OUTPUT.PUT_LINE( 'Contacte con el Administrador');
RAISE_APPLICATION_ERROR(-20502, 'Comando no autorizado');
END;
/

Creacin de un TRIGGER de control + actualizacin en una


tabla

CREATE OR REPLACE TRIGGER T_INS_ACTOR


BEFORE INSERT
ON ACTOR
FOR EACH ROW
DECLARE
numvalor NUMBER(5);
BEGIN
numvalor := 0;
SELECT COUNT(*) INTO numvalor FROM PAIS WHERE PAIS.IDENT_PAIS =
:new.NACIONALIDAD;
IF (numvalor = 0) THEN
DBMS_OUTPUT.PUT_LINE('La nacionalidad es desconocida:
'||:new.NACIONALIDAD) ;
DBMS_OUTPUT.PUT_LINE('Se realizar un insert en la tabla PAIS');
DBMS_OUTPUT.PUT_LINE( 'Complete la descripcin del PAIS
posteriormente');
INSERT INTO PAIS VALUES (:new.NACIONALIDAD,'A COMPLETAR');
END IF;
END;

Si ahora slo queremos aplicar el trigger a los actores nacidos antes del 31/12/1950
hay que aadir la siguiente clusula WHEN:

CREATE OR REPLACE TRIGGER T_INS_ACTOR


BEFORE INSERT
ON ACTOR
FOR EACH ROW
WHEN (old.FECHA_NACIMIENTO <= TO_DATE('31/12/1950','DD/MM/YYYY'))

Lenguaje SQL

Pgina 11 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


DECLARE
numvalor NUMBER(5);
BEGIN
numvalor := 0;
SELECT COUNT(*) INTO numvalor FROM PAIS WHERE PAIS.IDENT_PAIS
=
:new.NACIONALIDAD;
IF (numvalor = 0) THEN
DBMS_OUTPUT.PUT_LINE('La nacionalidad es desconocida:
'||:new.NACIONALIDAD) ;
DBMS_OUTPUT.PUT_LINE('Se va a realizar un insert en la tabla
PAIS ');
DBMS_OUTPUT.PUT_LINE('Complete la descripcin PAIS
posteriormente');
INSERT INTO PAIS VALUES (:new.NACIONALIDAD,'A COMPLETAR');
END IF;
END;
/

Creacin de un TRIGGER despus de las actualizaciones


Creacin del TRIGGER en la tabla PELICULAS:
CREATE OR REPLACE TRIGGER ACT_PELICULAS
AFTER INSERT OR DELETE OR UPDATE
ON PELICULAS
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
UPDATE SEGUI_ACT SET
NUM_PELICULAS_AADIDAS = NUM_PELICULAS_AADIDAS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
IF UPDATING THEN
UPDATE SEGUI_ACT SET
NUM_PELICULAS_MODIFICADAS = NUM_PELICULAS_MODIFICADAS +
1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
IF DELETING THEN
UPDATE SEGUI_ACT SET
NUM_PELICULAS_ELIMINADAS = NUM_PELICULAS_ELIMINADAS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
END;
/

Lenguaje SQL

Pgina 12 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


Creacin del TRIGGER en la tabla ACTOR:
CREATE OR REPLACE TRIGGER ACT_ACTOR
AFTER INSERT OR DELETE OR UPDATE
ON ACTOR
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
UPDATE SEGUI_ACT SET
NUM_ACTORES_AADIDOS = NUM_ACTORES_AADIDOS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
IF UPDATING THEN
UPDATE SEGUI_ACT SET
NUM_ACTORES_MODIFICADOS = NUM_ACTORES_MODIFICADOS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
IF DELETING THEN
UPDATE SEGUI_ACT SET
NUM_ACTORES_ELIMINADOS = NUM_ACTORES_ELIMINADOS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
END; /

Creacin del TRIGGER en la tabla CASTING:


CREATE OR REPLACE TRIGGER ACT_CASTING
AFTER INSERT OR DELETE OR UPDATE
ON CASTING
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
UPDATE SEGUI_ACT SET
NUM_CASTING_AADIDOS = NUM_CASTING_AADIDOS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
IF UPDATING THEN
UPDATE SEGUI_ACT SET
NUM_CASTING_MODIFICADOS = NUM_CASTING_MODIFICADOS +
1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');
END IF;
IF DELETING THEN
UPDATE SEGUI_ACT SET
NUM_CASTING_ELIMINADOS = NUM_CASTING_ELIMINADOS + 1
WHERE TO_CHAR(FECHA_DIA,'DD/MM/YYYY') =
TO_CHAR(SYSDATE,'DD/MM/YYYY');

Lenguaje SQL

Pgina 13 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


END IF;
END;
/

Algunos scripts tiles


Tamao real de una columna
Ejemplo:
SELECT TITULO,LENGTH (RTRIM(TITULO))AS LONGITUD_TITULO FROM
PELICULAS ORDER BY LENGTH (RTRIM(TITULO)), TITULO;

Buscar y eliminar duplicados en una tabla

SELECT * FROM ACTOR A WHERE A.ROWID > ANY


(SELECT B.ROWID FROM ACTOR B WHERE A.NOMBRE = B.NOMBRE AND
A.APELLIDO = B.APELLIDO);

Ahora para borrar la fila:


DELETE FROM ACTOR A WHERE A.ROWID > ANY
(SELECT B.ROWID FROM ACTOR B WHERE A.NOMBRE = B.NOMBRE AND
A.APELLIDO = B.APELLIDO);

Extraer los datos de una tabla en un fichero plano

SET HEADING OFF FEEDBACK OFF ECHO OFF VERIFY OFF SPACE 0 PAGESIZE
0 TERMOUT OFF WRAP OFF
SET LINESIZE 300
SET COLSEP ";"
SPOOL Extraccion_Actores.TXT
SELECT * FROM ACTOR;

Lenguaje SQL

Pgina 14 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


SPOOL OFF
SET TERMOUT ON

Ejemplo MySql comando INTO OUTFILE

SELECT * FROM ACTOR INTO OUTFILE 'C:\\Extraccion_Actores.TXT';

Tambin existen opciones para dar formato al resultado.


Como por ejemplo:

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'


LINES TERMINATED BY '\n' etc ...

Generar un SELECT de todas las columnas de una tabla sin


conocer su estructura.

COLUMN
COLUMN
SELECT
FROM
UNION
SELECT

VARIAB1 NOPRINT
VARIAB2 NOPRINT
'A' VARIAB1, 0 VARIAB2, 'SELECT '
DUAL

'B', COLUMN_ID, DECODE(COLUMN_ID, 1, '


', ' , ')
|| DECODE(DATA_TYPE,'DATE','TO_CHAR('||'"'||
COLUMN_NAME||'"'||',''YYYYMMDDHH24MISS'') '||'"'||
COLUMN_NAME||'"' ,'"'||COLUMN_NAME||'"')
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=UPPER('PELICULAS')
UNION
SELECT 'C', 0, 'FROM PELICULAS'
FROM DUAL
UNION
SELECT 'D', 0, ';'
FROM DUAL
ORDER BY 1,2
/

Generar comandos de insercin en una tabla a partir de un


fichero Excel
Lenguaje SQL

Pgina 15 de 17

Captulo 7: PARA IR MS LEJOS CON SQL


Celda J2
="INSERT INTO PELICULAS VALUES
("&A2&",'"&B2&"','"&C2&"','"&D2&"',TO_DATE('"&E2&"','DD/MM/YYYY'),
"&F2&","&G2&",'"&H2&"','"&I2&"');"

Celda J3
="INSERT INTO PELICULAS VALUES
("&A3&",'"&B3&"','"&C3&"','"&D3&"',TO_DATE('"&E3&"','DD/MM/YYYY'),
"&F3&","&G3&",'"&H3&"','"&I3&"');"

Celda J4
="INSERT INTO PELICULAS VALUES
("&A4&",'"&B4&"','"&C4&"','"&D4&"',TO_DATE('"&E4&"','DD/MM/YYYY'),
"&F4&","&G4&",'"&H4&"','"&I4&"');"

Celda J5
="INSERT INTO PELICULAS VALUES
("&A5&",'"&B5&"','"&C5&"','"&D5&"',TO_DATE('"&E5&"','DD/MM/YYYY'),
"&F5&","&G5&",'"&H5&"','"&I5&"');"

Celda J6
="INSERT INTO PELICULAS VALUES
("&A6&",'"&B6&"','"&C6&"','"&D6&"',TO_DATE('"&E6&"','DD/MM/YYYY'),
"&F6&","&G6&",'"&H6&"','"&I6&"');"

Lenguaje SQL

Pgina 16 de 17

Captulo 7: PARA IR MS LEJOS CON SQL

Procedimiento almacenado para eliminar filas en una tabla


CREATE OR REPLACE PROCEDURE Elim_Filas_Peliculas
(iinicio
IN number)
AS
paso number;
indic number;
irows number;
maxIDENT_PELICULAS number;
done boolean;
BEGIN
done := FALSE;
paso :=100000;
indic := iinicio;
irows := iinicio + paso;
maxIDENT_PELICULAS :=0;
select max(IDENT_PELICULAS) into maxIDENT_PELICULAS

from clie;

while not done loop


DELETE from PELICULAS where IDENT_PELICULAS between indic and
irows ;
commit;
DBMS_OUTPUT.PUT_LINE('indic '|| indic||' irows ' ||irows );
irows := irows+paso;
indic := indic+paso;
if indic > maxIDENT_PELICULAS then
done := TRUE;
end if;
END loop;
commit;
END; /

Lenguaje SQL

Pgina 17 de 17

S-ar putea să vă placă și