Desarrollo y explotación de aplicaciones empresariales con base de datos Oracle: 1835.090 Julio de 2004 1
Presentación del curso 2
Presentación Director Luis Vinuesa Martínez Profesores Alberto Manuel Fernández Álvarez Ángel Lombas Fernández Luis Vinuesa Martínez 3
Presentación Asistencia obligatoria (80%) Evaluación Trabajo individual (propuesto por los profesores o por el alumno, con aprobación por parte de los profesores) Mail del curso curso_oracle90@terra.es 4
Presentación Calendario Entrega de prácticas Plazos Elección de práctica Calificaciones Software 5
Presentación Directorio de trabajo Cread un directorio en el ordenador SOLO TRABAJAR EN ESTE DIRECTORIO. Página del curso www.di.uniovi.es/~vinuesa/cursos/curso_oracle/curso90.htm 6
Introducción 7
Introducción Bases de datos relacionales Conceptos Evolución Utilidad Situación actual SQL 8
Arquitectura Oracle 9
Arquitectura 10
Arquitectura Instancias Schema User/Password SQLNET o NET8 SQLNET LISTENER 11
Arquitectura - memoria SGA (Shared Global Area) Database Buffer/caché de buffer de base de datos Redo-log-buffer /caché de rehacer Shared Pool / área de agrupamiento compartido Dictionary cache /caché de diccionario Library cache (caché de SQL) PGA (Program/Process Global Area) 12
Arquitectura - procesos DBWR (database writer) LGWR (log writer) SMON (system monitor) PMON (process monitor) ARCH (archiver) CKPT (checkpoint process) 13
Arquitectura organización lógica Base de datos Tablespace (Espacio de tablas) Segmentos Extensiones (Extent) 14
Arquitectura Ficheros Datafiles/archivos de base de datos Bloques [Rowid] Control Files/archivos de control Redo-log Files/ficheros de rehacer Archive Log PFILE y SPFILE 15
Arquitectura - transacciones Commit Rollback DML explícito DDL implícito 16
Arquitectura seguridad Usuarios Privilegios De sistema De objetos Roles Perfiles 17
Arquitectura - objetos Tablas Vistas Sinónimos Índices Clusters Database links Secuencias (sequence) Pseudocolumnas 18
Administración 19
Administración Servicios de Oracle Explicación de la arquitectura OEM 20
Arquitectura Práctica: Instalación del cliente Instalar: SQL+, oci, jdbc, odbc Configuración del sqlnet para la conexión a la base de datos (ficheros sqlnet.ora y tnsnames.ora) Conexión con el SQL+ Variable de entorno tns_admin (para el sqlnet) Edición del registro de Windows 21
Administración Práctica: OEM, creación de usuario Crear usuario de la BBDD con el role DBA (curso90/curso90) Crear usuario de oem con permiso de superadministrador (oem90/oem90) Entrar al oem con el usuario recién creado Crear un nuevo usuario (individual para cada uno, permisos dba) Conectarse con ese nuevo usuario 22
Administracion Práctica: OEM, uso http://156.35.150.125 (normalmente 3339) Descubrir nodos DBA studio: Creación de tablespaces Creación de datafiles Creación de usuarios 23
Administración Práctica: configuración de una instancia Modificación del init%.ora (instance manager) NLS_DATE_FORMAT = DD/MM/YYYY NLS_LANGUAGE = SPANISH NLS_TERRITORY = SPAIN UTL_FILE_DIR = * REMOTE_DEPENDENCIES_MODE = SIGNATURE/TIMESTAMP 24
Administración Práctica: Creación de nueva instancia Crear una nueva instancia Contraseñas estándar Comprobar el listener.ora Ver la estructura de directorios creada: oracle\admin y oracle\oradata y \database Configurar los clientes (sqlnet) para que se conecten a ella Configurar el oem para que se conecte a ella (primero rearrancar el Agent) 25
Administración Práctica Export Import SQL Loader 26
SQL Explotación de la Información 27
SQL Manejo del SQL+ Connect usuario[/contraseña][@string] Todas las sentencias acaban en ; Ed Ejecución de la ultima sentencia Manejo del ratón Desc Variables y parámetros 28
SQL Commit/Rollback Tabla dual Vista tabs Sysdate Valores nulos (null y NVL) Uso de comodines (% y _ ) TO_CHAR / TO_DATE / TO_NUMBER DECODE 29
SQL Tablas de ejemplo Tpais Tprovincia Tciudad Tcalle Tdomicilio Tpersona Tpersona_domicilio 30
SQL Uso de alias En las columnas En las tablas 31
SQL Consultas Order by Operadores Funciones Subconsultas Join Selfjoin Outer Join Group By Connect by Conjuntos 32
SQL ORDER BY La ordenación puede ser de distintos tipos, y depende de NLS_SORT ASC, DESC 33
SQL Operadores Precedencia Aritméticos (+,-,*,/) Concatenación ( ) Comparación(=,<>,>,<,IN, SOME, LIKE, BETWEEN, IS NULL...) Lógicos (AND, OR, NOT) Conjuntos (UNION [ALL], INTERSECT, MINUS) 34
SQL Funciones De un valor Numéricas De caracter De fecha De conversión Otras Agregación 35
SQL - subconsultas OPCIÓN A SELECT deptno FROM emp WHERE empno=7369; (resultado 20) SELECT empno FROM emp WHERE deptno=20; OPCIÓN B SELECT empno FROM emp WHERE deptno=(select deptno FROM emp WHERE empno=7369); 36
SQL - subconsultas La subconsulta puede aparecer en la cláusula WHERE y en la cláusula FROM Pueden devolver un valor único o una lista de valores. SELECT ename,deptno FROM emp WHERE (sal,deptno) IN (SELECT MAX(sal),deptno FROM emp GROUP BY deptno); 37
SQL - Joins Join Selfjoin Outer join 38
SQL - Joins SELECT e1.empno FROM emp e1 WHERE e1.deptno=(select deptno FROM emp WHERE empno=7369) SELECT e1.empno FROM emp e1, emp e2 WHERE e1.deptno=e2.deptno AND e2.empno=7369 39
SQL Group by Agrupa filas y devuelve información sumariada de cada grupo de filas. Necesaria cuando se desea recuperar valores de funciones de grupo (MAX; MIN, SUM, etc.) junto a valores no de grupo. 40
SQL GROUP BY SELECT deptno, MIN(sal), MAX (sal) FROM emp WHERE job = 'CLERK' GROUP BY deptno; SELECT deptno, MIN(sal), MAX (sal) FROM emp WHERE job = 'CLERK' GROUP BY deptno HAVING MIN(sal) < 1000; 41
SQL CONNECT BY Permite realizar consultas jerárquicas (árbol genealógico) SELECT LPAD(' ',6*(LEVEL-1)) ename nombre FROM emp START WITH job='president' CONNECT BY PRIOR empno = mgr; 42
SQL - Ejercicios Calles de Oviedo y de Gijón que empiecen por A o por C 43
SQL - Ejercicios Calles de Oviedo y de Gijón que empiecen por A o por C SELECT des_calle,des_ciudad FROM tcalle ca, tciudad ci WHERE ca.cod_pais=ci.cod_pais AND ca.cod_provincia=ci.cod_provincia AND ca.cod_ciudad=ci.cod_ciudad AND ca.cod_pais=3 --España AND ca.cod_provincia=2 -- Asturias AND (UPPER(ca.des_calle) LIKE 'A%' OR UPPER(ca.des_calle) LIKE 'C%') AND (UPPER(des_ciudad) LIKE '%OVIEDO' OR UPPER(des_ciudad) LIKE '%GIJON') 44
SQL - Ejercicios Personas con más de un domicilio 45
SQL - Ejercicios Personas con más de un domicilio SELECT DISTINCT(p.dni) FROM tpersona_domicilio p WHERE 1<(SELECT COUNT(*) FROM tpersona_domicilio p2 WHERE p.dni=p2.dni) SELECT p2.dni FROM tpersona_domicilio p2 GROUP BY p2.dni HAVING COUNT(*)>1 46
SQL - Ejercicios Nombre de ciudad, código, código de provincia y % total del calles que tiene esa ciudad sobre el total de calles de ciudades que tengan en su nombre la palabra AVILES, en España (cod_pais=3) 47
SQL - Ejercicios SELECT c.des_ciudad, c.cod_ciudad, c.cod_provincia,a.num_calles/b.total_calles "%calles" FROM (SELECT ca.cod_pais,ca.cod_ciudad,ca.cod_provincia, COUNT(*) num_calles FROM tcalle ca, tciudad ci WHERE ca.cod_pais=3 --España AND ca.cod_pais=ci.cod_pais AND ca.cod_provincia=ci.cod_provincia AND ca.cod_ciudad=ci.cod_ciudad AND des_ciudad LIKE '%AVILES' GROUP BY ca.cod_pais,ca.cod_ciudad,ca.cod_provincia) a, (SELECT COUNT(*) total_calles FROM tcalle ca,tciudad ci WHERE ca.cod_pais=3 /*España*/ AND ca.cod_pais=ci.cod_pais AND ca.cod_provincia=ci.cod_provincia AND ca.cod_ciudad=ci.cod_ciudad AND des_ciudad LIKE '%AVILES') b, tciudad c WHERE c.cod_pais=a.cod_pais AND c.cod_provincia=a.cod_provincia AND c.cod_ciudad=a.cod_ciudad 48
SQL - Ejercicios Obtener el nombre y código de la calle y la ciudad a la que pertenece que tiene el nombre más largo dentro de cada ciudad 49
SQL - Ejercicios SELECT des_calle, cod_calle, ca.cod_pais, ca.cod_provincia, ca.cod_ciudad FROM tcalle ca,( SELECT cod_pais, cod_provincia, cod_ciudad, MAX(LENGTH(des_calle)) longitud FROM tcalle GROUP BY cod_pais, cod_provincia, cod_ciudad) b WHERE b.cod_pais=ca.cod_pais AND b.cod_provincia=ca.cod_provincia AND b.cod_ciudad=ca.cod_ciudad AND LENGTH(des_calle)= longitud ORDER BY cod_pais, cod_provincia, cod_ciudad, des_calle; 50
SQL - Ejercicios Departamento con mayor número de empleados y el número de ellos 51
SQL - Ejercicios Departamento con mayor número de empleados y el número de ellos 52
SQL - Ejercicios SELECT deptno, cuantos FROM (SELECT deptno,count(*) cuantos FROM emp GROUP BY deptno) a WHERE cuantos=(select MAX(cuantos) FROM (SELECT deptno, COUNT(*) cuantos FROM emp GROUP BY deptno) a) SELECT * FROM (SELECT deptno, COUNT(*) cuantos FROM emp GROUP BY deptno ORDER BY cuantos DESC) a WHERE ROWNUM<2 53
SQL - Ejercicios Calle con mas domicilios de una ciudad dada (p.ej: cod_pais=1, cod_provincia=1 y cod_ciudad=1) 54
SQL - Ejercicios SELECT ca.cod_calle,des_calle,cuantos FROM tcalle ca, (SELECT cod_pais, cod_provincia, cod_ciudad, cod_calle, COUNT(*) cuantos FROM tdomicilio WHERE cod_pais=1 AND cod_provincia=1 AND cod_ciudad=1 GROUP BY cod_pais, cod_provincia, cod_ciudad, cod_calle) o WHERE ca.cod_pais=o.cod_pais AND ca.cod_provincia=o.cod_provincia AND ca.cod_ciudad=o.cod_ciudad AND ca.cod_calle=o.cod_calle AND o.cuantos=(select MAX(cuantos) FROM (SELECT cod_pais, cod_provincia, cod_ciudad, cod_calle, COUNT(*) cuantos FROM tdomicilio WHERE cod_pais=1 AND cod_provincia=1 AND cod_ciudad=1 GROUP BY cod_pais, cod_provincia, cod_ciudad, cod_calle) h) 55
SQL - Ejercicios Obtener la media de domicilios que hay por cada ciudad. 56
SQL - Ejercicios SELECT (SELECT COUNT(*) FROM tdomicilio) /(SELECT COUNT(*) FROM (SELECT cod_pais, cod_provincia, cod_ciudad FROM tdomicilio GROUP BY cod_pais, cod_provincia,cod_ciudad)) FROM dual; SELECT COUNT(*)/COUNT( DISTINCT cod_pais*10000000+cod_provincia*10000+cod_ciudad) FROM tdomicilio; SELECT AVG(cuantos) FROM (SELECT COUNT(*) cuantos FROM tdomicilio GROUP BY cod_pais,cod_provincia,cod_ciudad) b; 57
SQL - Ejercicios Obtener el total de domicilios que hay por país, por provincia, por ciudad y totales. 58
SQL - Ejercicios Obtener el total de domicilios que hay por país, por provincia, por ciudad y totales. SELECT DECODE(GROUPING(cod_pais),1,'Todos Paises',cod_pais), DECODE(GROUPING(cod_provincia),1,'Todas las provincias',cod_provincia), DECODE(GROUPING(cod_ciudad),1,'Todas las ciudades',cod_ciudad), COUNT(*) total_domicilios FROM tdomicilio GROUP BY ROLLUP (cod_pais,cod_provincia,cod_ciudad) 59
SQL - Ejercicios Obtener un árbol genealógico de los descendientes de la persona con DNI=200 60
SQL - Ejercicios Obtener un árbol genealógico de los descendientes de la persona con DNI=200 SELECT LPAD(' ',6*(LEVEL-1)) nombre FROM tpersona START WITH dni=200 CONNECT BY PRIOR dni = padre; 61
PL/SQL Explotación avanzada de la información 62
PL/SQL Bloque Tipos de datos Estructuras de control Sentencias SQL Transacciones Cursores Excepciones Subprogramas: Procedimientos y Funciones Packages Triggers Packages estándar 63
PL/SQL - Bloque DECLARE Declaración de Variables; BEGIN Sentencias Ejecutables; [EXCEPTION Declaración de Excepciones;] END; 64
PL/SQL Tipos de Datos Más usados NUMBER [(precisión,escala)] CHAR [(longitud_máxima)] VARCHAR2 [(longitud_máxima)] DATE BOOLEAN RECORD TABLE 65
PL/SQL Tipos de Datos Muy importantes: Variables y constantes: %TYPE y %ROWTYPE Sintaxis %TYPE: <nombre variable%type>; <nombre propietario.tabla.columna%type>; Sintaxis %ROWTYPE <nombre propietario.tabla.columna%rowtype>; 66
PL/SQL Tipos de Datos Tipo tabla: TYPE nombre IS TABLE OF {variable%type tipo_columna tabla.columna%type} [NOT NULL] INDEX BY BINARY_INTEGER; Tipo record: TYPE nombre IS RECORD (campo1 {tipo_dato variable%type tabla.columna%type tabla%rowtype} [NOT NULL], campo2 {tipo_dato variable%type tabla.columna%type tabla%rowtype} [NOT NULL],......); 67
PL/SQL - Declaraciones Sección DECLARE <nombre> [CONSTANT] <tipo de dato> [NOT NULL] [:=<expresión>]; Ejemplo (ver ej1) DECLARE impuestos NUMBER; continua BOOLEAN; multiplicador CONSTANT NUMBER(3,2):=0.10; fecha DATE; sal_max NUMBER(11,2):=500*multiplicador; nombre CHAR(30) BEGIN 68
PL/SQL - Declaraciones Ejemplo DECLARE numero_dep dept.deptno%type; nuevo_balance NUMBER(8):=10; referencia nuevo_balance%type; reg_emp emp%rowtype; BEGIN SELECT * INTO reg_emp FROM emp WHERE...; IF reg_emp.deptno=20 THEN... END; 69
PL/SQL - Ámbito DECLARE a CHAR; b NUMBER; BEGIN --a CHAR y B DECLARE a NUMBER; c DATE; BEGIN --a NUMBER, b y c END; DECLARE d BOOLEAN; BEGIN --a CHAR, b y d END; END; 70
PL/SQL Asignación y Operadores Asignación := Operadores (mayor a menor precedencia) **,NOT +,- *,/ +,-, =,!=,<,>,<=,>= IS NULL, LIKE, IN, BETWEEN AND OR Exponenciación, negación Identidad, negación Multiplicación, división Suma, resta, concatenación Comparación Unión Inclusión 71
PL/SQL Estructuras de control Condicional Iterativo Secuencial 72
PL/SQL Control condicional IF THEN IF condición THEN conjunto de sentencias; END IF; IF THEN ELSE IF condición THEN conjunto de sentencias1; ELSE conjunto de sentencias2; END IF; IF THEN ELSIF IF condición1 THEN conjunto de sentencias1; ELSIF condición2 THEN conjunto de sentencias2; ELSE conjunto de sentencias3; END IF; 73
PL/SQL Control condicional Ejemplos IF x>y THEN alto:=x; END IF; IF cadena= pe THEN UPDATE tabla...; ELSE UPDATE tabla2...; END IF; IF contador<20 THEN cambia:=50; ELSIF contador>50 THEN cambia:=30; ELSE cambia:=20; END IF; 74
PL/SQL Control iterativo LOOP LOOP conjunto de sentencias; EXIT WHEN condición de salida conjunto de sentencias; END LOOP; 75
PL/SQL Control iterativo WHILE WHILE condición de permanencia LOOP conjunto de sentencias; END LOOP; 76
PL/SQL Control iterativo Bucle FOR numérico FOR variable IN [REVERSE] rango_mínimo..rango_máximo LOOP conjunto de sentencias; END LOOP 77
PL/SQL Control iterativo DECLARE i NUMBER(3):=1; BEGIN WHILE i<10 LOOP INSERT INTO tab VALUES(i); i:=i+1; END LOOP; LOOP INSERT INTO tab VALUES(i); i:=i+1; EXIT WHEN i>9; END LOOP; FOR i IN 1..9 LOOP INSERT INTO tab VALUES(i); END LOOP; END; 78
PL/SQL Control secuencial GOTO (no usar) NULL indica de forma explícita inacción. IF ratio>90 THEN calcula(dni); ELSE NULL; END IF; 79
PL/SQL - Transacciones COMMIT ROLLBACK SAVEPOINT punto de salvaguarda 80
PL/SQL - Transacciones Ejemplo BEGIN INSERT INTO tabla VALUES ( uno ); SAVEPOINT A; INSERT INTO tabla VALUES ( dos ); SAVEPOINT B; INSERT INTO tabla VALUES ( tres ); SAVEPOINT C;... IF x THEN ROLLBACK TO B; ELSIF y THEN ROLLBACK; ELSE ROLLBACK TO A; END IF; COMMIT; END; 81
PL/SQL - Cursores Declaración CURSOR nombre IS sentencia SELECT [cláusula FOR UPDATE OF ] ; Forma de uso (el más sencillo) FOR variable IN nombre_cursor LOOP conjunto de sentencias END LOOP; 82
PL/SQL - Cursores Ejemplo (ver ej2) DECLARE CURSOR c1 IS SELECT * FROM tpersona; BEGIN FOR i IN c1 LOOP IF i.dni= ffff THEN...; END LOOP; END; 83
PL/SQL - Excepciones Tipos Predefinidas Definidas por el usuario 84
PL/SQL - Excepciones Control de excepciones... EXCEPTION WHEN nombre_de_excepción THEN conjunto de sentencias; WHEN nombre_de_excepción THEN conjunto de sentencias;... WHEN OTHERS THEN conjunto de sentencias; END; 85
PL/SQL - Excepciones Excepciones predefinidas: DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGON_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR STORAGE_ERROR TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE TRANSACTION_BACKED_OUT ROWTYPE_MISMATCH CURSOR_ALREADY_OPEN ACCES_INTO_NULL COLLECTION_IS_NULL SUBSCRIPT_OUTSIDE_LIMIT SUBSCRIPT_BEYOND_COUNT 86
PL/SQL - Excepciones Definidas por el usuario Sintaxis Nombre EXCEPTION; [PRAGMA EXCEPTION_INIT(nombre,-número);] Ejemplo DECLARE mi_error EXCEPTION; PRAGMA EXCEPTION_INIT(mi_error,-1999);... Invocación mediante RAISE RAISE mi_error; 87
PL/SQL - Excepciones Funciones usadas con excepciones: SQLCODE devuelve el código de error que ha ocurrido SQLERRM devuelve la cadena de texto correspondiente al error ocurrido 88
PL/SQL - Excepciones Ejemplo (ver ej3) DECLARE fatal EXCEPTION;... BEGIN... IF campo IS NULL THEN RAISE fatal;... EXCEPCTION WHEN fatal THEN... WHEN OTHERS THEN cod:=sqlcode; mensaje:=sqlerrm; INSERT INTO errores VALUES (cod,mensaje); COMMIT; END; 89
PL/SQL - Subprogramas Tipos Procedimientos (PROCEDURE) Funciones (FUNCTION) Invocación Desde otro subprograma Desde aplicaciones Desde SQL+ (EXECUTE) 90
PL/SQL - Procedimientos Sintaxis CREATE [OR REPLACE] PROCEDURE [esquema.]nombre [(argumento1 [{IN OUT IN OUT}] tipo_dato [{:= DEFAULT} valor],... argumenton [{IN OUT IN OUT}] tipo_dato [{:= DEFAULT} valor])] {IS AS} cuerpo de procedimiento 91
PL/SQL - Procedimientos Estructura CREATE OR REPLACE PROCEDURE nombre IS /*sección declarativa*/ BEGIN /*sección ejecutable*/ EXCEPTION /*sección de excepciones*/ END [nombre]; 92
PL/SQL - Procedimientos Ejemplo CREATE OR REPLACE PROCEDURE ejemplo (p_departamento NUMBER, p_emp temp.empno%type, p_accion NUMBER(1) DEFAULT 1) IS v_aux NUMBER; v_nuevo_dep tdept.deptno%type; BEGIN... EXCEPTION WHEN... END ejemplo; 93
PL/SQL - Funciones Sintaxis CREATE [OR REPLACE] FUNCTION [esquema.]nombre [(argumento1 [{IN OUT IN OUT}] tipo_dato [{:= DEFAULT} valor],... argumenton [{IN OUT IN OUT}] tipo_dato [{:= DEFAULT} valor])] RETURN tipo_dato_retorno {IS AS} cuerpo de función 94
PL/SQL - Funciones En el cuerpo de la función es necesario que se use la orden RETURN para devolver el valor de retorno de la función (También se puede usar en procedures sin ningún parámetro y sirve para provocar la salida inmediata del mismo) 95
PL/SQL - Funciones Ejemplo CREATE OR REPLACE FUNCTION calcula (p_dni tpersona%type, p_sal OUT NUMBER) RETURN NUMBER IS v_porcen NUMBER(3,2); BEGIN... IF v_porcen>0.25 THEN RETURN 1; ELSE RETURN 2; END calcula; 96
PL/SQL - Subprogramas Manejo de excepciones RAISE (para excepciones predefinidas o definidas por el usuario) RAISE_APPLICATION_ERROR (para crear excepciones con sus propios mensajes de error) RAISE_APPLICATION_ERROR(número,mensaje) El número debe estar entre 20000 y 20999 El mensaje puede ser de hasta 512 caracteres 97
PL/SQL - Subprogramas Privilegio EXECUTE Parámetro REMOTE_DEPENDENCIES_MODE SIGNATURE TIMESTAMP 98
PL/SQL - Paquetes Pueden incluir: Procedimientos Funciones Cursores Tipos Variables (permiten variables privadas y globales ) Excepciones 99
PL/SQL - Paquetes Constan de Especificación Cuerpo 100
PL/SQL - Paquetes Especificación CREATE [OR REPLACE] PACKAGE nombre {IS AS} especificación_procedimientos especificación_funciones declaración_variables definición_tipo declaración_excepciones declaración_cursores END [nombre]; 101
PL/SQL - Paquetes Cuerpo CREATE [OR REPLACE] PACKAGE BODY nombre {IS AS} código_procedimientos código_funciones [BEGIN código_inicialización_paquete] END [nombre]; 102
PL/SQL - Paquetes Permiten la sobrecarga de procedimientos y funciones Para referirnos a ellos: Esquema.paquete.objeto 103
PL/SQL - Disparadores Subprogramas que se ejecutan cuando ocurre un suceso de disparo (orden DML, INSERT, UPDATE o DELETE) sobre una tabla de la base de datos 104
PL/SQL Disparadores Un disparador puede ejecutarse BEFORE AFTER De una operación INSERT UPDATE DELETE 105
PL/SQL - Disparadores Sintaxis CREATE [OR REPLACE] TRIGGER esquema.nombre {BEFORE AFTER} {[OR]DELETE [OR] INSERT [OR] UPDATE [OF columna]} ON esquema.tabla [REFERENCING OLD [AS] antiguo NEW[AS] nuevo] NO SE USA [FOR EACH ROW] [WHEN condición] Bloque PL/SQL 106
PL/SQL - Disparadores :NEW :OLD UPDATING INSERTING DELETING 107
PL/SQL - Disparadores Orden de ejecución 1. BEFORE 2. BEFORE ROW 3. AFTER ROW 4.... 5. BEFORE ROW 6. AFTER ROW 7. AFTER 108
PL/SQL Disparadores Si hay dos disparadores con el mismo evento orden de ejecución aleatorio No se puede acceder a una tabla mutante (aquella que está siendo modificada, directamente o a través de ON DELETE CASCADE) No se puede modificar una tabla referenciada en las columnas implicadas en restricciones de integridad referencial que tiene que comprobar la sentencia que dispara el trigger. 109
PL/SQL Paquetes estándar DBMS_JOB DBMS_OUTPUT UTL_FILE 110