Академический Документы
Профессиональный Документы
Культура Документы
Creacin de Procedimientos
3-2
3-3
entorno de llamada
3-4
Parmetro Actual Tiene que ser una puede ser un variable literal, expresin, cosntate o variable inicializada
3-5
Variable no Inicializada
SQL> SQL> CREATE CREATE OR OR REPLACE REPLACE PROCEDURE PROCEDURE raise_salary raise_salary 2 2 (v_id (v_id in in emp.empno%TYPE) emp.empno%TYPE) 3 3 IS IS 4 4 BEGIN BEGIN 5 UPDATE 5 UPDATE emp emp 6 SET sal 6 SET sal = = sal sal * * 1.10 1.10 7 WHERE 7 WHERE empno empno = = v_id; v_id; 8 8 END END raise_salary; raise_salary; 9 9 / / Procedure Procedure created. created. SQL> SQL> EXECUTE EXECUTE raise_salary raise_salary (7369) (7369) PL/SQL PL/SQL procedure procedure successfully successfully completed. completed.
3-6 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
3-7
3-8
SQL> SQL> EXECUTE EXECUTE query_emp query_emp (7654, (7654, :g_name, :g_name, :g_salary, :g_salary, 2 2 :g_comm) :g_comm) PL/SQL PL/SQL procedure procedure successfully successfully completed. completed. SQL> SQL> PRINT PRINT g_name g_name G_NAME G_NAME ----------------------------MARTIN MARTIN
3-9 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
Parmetros IN OUT
Calling environment
'(800)633-0575'
FORMAT_PHONE procedure
'(800)633-0575'
v_phone_no
SQL> CREATE OR REPLACE PROCEDURE format_phone 2 (v_phone_no IN OUT VARCHAR2) 3 IS 4 BEGIN 5 v_phone_no := '(' || SUBSTR(v_phone_no,1,3) || 6 ')' || SUBSTR(v_phone_no,4,3) || 7 '-' || SUBSTR(v_phone_no,7); 8 END format_phone; 9 /
3-10
3-11
SQL> SQL> exec exec add_dept add_dept --- inserta inserta en en tabla tabla el el valor valor unknown unknown en en los los campos campos PL/SQL PL/SQL procedure procedure successfully successfully completed. completed. SQL> SQL> exec exec add_dept(TRAINING,NEW add_dept(TRAINING,NEW YORK); YORK);
SELECT SELECT * * FROM FROM dept; dept; DNAME DNAME --------------------------... ... unknown unknown TRAINING TRAINING EDUCATION EDUCATION unknown unknown LOC LOC ------------------------... ... unknown unknown NEW NEW YORK YORK DALLAS DALLAS BOSTON BOSTON
3-13
3-14
Ejemplo:
SQL> SQL> DROP DROP Procedure Procedure PROCEDURE PROCEDURE raise_salary; raise_salary; dropped. dropped.
3-15
Resumen
Un procedimiento es un bloque nombrado PL/SQL que realiza una accin. Use parmetros para pasar datos desde el entorno de llamada al procedimiento. Los Procedimientos pueden ser llamados desde cualquier herramienta o lenguaje que soporte PL/SQL. Los Procedimientos pueden servir como bloques de una aplicacin.
3-16 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
3
Creacin de Funciones
3-18
3-19
Creacin de una Funcin Almacenada Usando SQL*Plus: Ejemplo SQL> CREATE OR REPLACE SQL> CREATE OR REPLACE FUNCTION FUNCTION get_sal get_sal
2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 (v_id emp.empno%TYPE) (v_id IN IN emp.empno%TYPE) RETURN RETURN NUMBER NUMBER IS IS v_salary emp.sal%TYPE v_salary emp.sal%TYPE :=0; :=0; BEGIN BEGIN SELECT SELECT sal sal INTO v_salary INTO v_salary FROM emp FROM emp WHERE WHERE empno empno = = v_id; v_id; RETURN RETURN (v_salary); (v_salary); END END get_sal; get_sal; / /
3-20
Ejecucin de Funciones
Llame a la funcin como parte de una expresin PL/SQL. Cree una variable host que recoja el valor devuelto. Ejecute la funcin. La variable host se volcar en valor de RETURN.
3-21
Funcin GET_SAL
v_id RETURN v_salary
SQL> START get_salary.sql Procedure created. created SQL> SQL> VARIABLE VARIABLE g_salary g_salary number number SQL> SQL> EXECUTE EXECUTE :g_salary :g_salary := := get_sal(7934) get_sal(7934) PL/SQL PL/SQL procedure procedure successfully successfully completed. completed. SQL> SQL> PRINT PRINT g_salary g_salary G_SALARY G_SALARY ----------------------------------1300 1300
3-22 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
3-25
Ejemplo:
SQL> SQL> DROP DROP FUNCTION FUNCTION get_salary; get_salary; Function Function dropped. dropped.
3-26
Procedimiento o Funcin?
Procedimiento Funcin
Entorno de llamada
Entorno de llamada
IN argumento
3-27
3-28
3-29
Resumen
Una funcin es un bloque nombrado PL/SQL que tiene que devolver un valor. Una funcin es llamada como parte de una expresin. Una funcin almacenada puede ser llamada en sentencias SQL.
3-30
3
Creacin de Paquetes
No pueden ser llamados, parametrizados o anidados Permiten a Oracle8 leer mltiples objetos en memoria, de una sola vez.
3-32 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
3-33
3-34
Desarrollo de un Paquete
1
Especificacin del Paquete
Declaracin del Procedimiento A
4
Cuerpo del Paquete
Definicin del Procedimiento B Definicin del Procedimiento A
3-35
Desarrollo de un Paquete
1
Especificacin del Paquete
Declaracin del Procedimiento A
4
Cuerpo del Paquete
Definicin del Procedimiento B Definicin del Procedimiento A
3-36
3-37
3-38
3-39
3-40
3-41
1 2
3-42
3-44
3-47
3-48
3-49
3-50
3-51
3-53
3-54
Eliminacin de Paquetes
Para borrar la especificacin del paquete y el cuerpo:
DROP DROP PACKAGE PACKAGE package_name package_name
3-55
Resumen
Mejoran la organizacin, gestin, seguridad y rendimiento. Agrupan procedimientos y funciones. Se puede cambiar el cuerpo de un paquete sin que afecte a la especificacin. Conceden acceso de seguridad al paquete completo.
3-56
Resumen
Ocultan el cdigo fuente a los usuarios. Cargan todo el paquete en memoria en la primera llamada. Reducen el acceso a disco para llamadas posteriores. Ofrecen identificadores para las sesiones de usuario.
3-57
Resumen
Comando CREATE [OR REPLACE] PACKAGE CREATE [OR REPLACE] PACKAGE BODY DROP PACKAGE Tarea Crea o modifica la especificacin de un paquete ya existente Crea o modifica el cuerpo de un paquete ya existente Borra tanto la especificacin como el cuerpo de un paquete Borra el cuerpo de un paquete
3-58
3
Creacin de Triggers en la Base de Datos
3-60
3-61
Tabla EMP
EMPNO ENAM 7838 E 7698 KING 7369 BLAK E 7788 SMIT H
3-62
Trigger CHECK_SAL
JOB PRESIDENT MANAGER CLERK ANALYST SAL 5000 2850 800 3000
SCOT T
Creacin de Disparadores
Momento: BEFORE o AFTER Evento: INSERT o UPDATE o DELETE Nombre Tabla: On table Tipo de Trigger: Row o statement Clasula When: Condicin Cuerpo del Trigger: DECLARE BEGIN END;
3-63 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
Componentes de un Trigger
Momento: Cundo debera dispararse? BEFORE: El cdigo del cuerpo del trigger se ejecutar antes del evento DML AFTER: El cdigo del cuerpo del trigger se ejecutar antes del evento DML
3-64
Componentes de un Trigger
Evento: Qu operacin DML provocar la ejecucin trigger? INSERT UPDATE DELETE Cualquier combinacin de las anteriores
3-65
Componentes de un Trigger
Tipo de Trigger: Cuntas veces debera ejecutarse el cuerpo del trigger cuando ocurre el evento? Statement: El cuerpo del trigger se ejecuta slo una vez para el evento. Este es el comportamiento por defecto. Row: El cuerpo del trigger se ejecuta una vez para cada registro afectado por el evento.
3-66 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
Componentes de un Trigger
Cuerpo del Trigger: Qu accin debera de realizar el trigger? El cuerpo del trigger es definido con un bloque PL/SQL annimo [DECLARE] BEGIN [EXCEPTION] END;
3-67 Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
3-68
CREATE CREATE OR OR REPLACE REPLACE TRIGGER TRIGGER secure_emp secure_emp BEFORE BEFORE INSERT INSERT ON ON emp emp BEGIN BEGIN IF IF (TO_CHAR (TO_CHAR (sysdate,'DY') (sysdate,'DY') IN IN ('SAT','SUN')) ('SAT','SUN')) OR OR (TO_CHAR(sysdate,'HH24')NOT (TO_CHAR(sysdate,'HH24')NOT BETWEEN BETWEEN '08' '08' AND AND '18' '18' THEN THEN RAISE_APPLICATION_ERROR RAISE_APPLICATION_ERROR (-20500, (-20500, 'You 'You may may only only insert insert into into EMP EMP during during normal normal hours.'); hours.'); END END IF; IF; END; END; / /
Javier Balbuena / Jos Manuel Ferrer. Curso 2.001 / 2.002
Ejemplo
SQL> SQL> 2 2 INSERT INSERT INTO INTO emp emp (empno, (empno, ename, ename, deptno) deptno) VALUES (7777, VALUES (7777, 'BAUWENS', 'BAUWENS', 40); 40); INSERT INSERT INTO INTO emp emp (empno, (empno, ename, ename, deptno) deptno) * * ERROR ERROR at at line line 1: 1: ORA-20500: ORA-20500: You You may may only only insert insert into into EMP EMP during during normal normal hours. hours. ORA-06512: ORA-06512: ORA-04088: ORA-04088: at at "SCOTT.SECURE_EMP", "SCOTT.SECURE_EMP", error error during during execution execution line line 4 4 of of trigger trigger
'SCOTT.SECURE_EMP' 'SCOTT.SECURE_EMP'
3-70
3-72
Continuacin
OLD_TITLE NULL CLERK NEW_TITLE ANALYST SALESMAN OLD_SALARY NULL 1100 NEW_SALARY 3500 1100
3-75
3-77
3-78
Eliminacin de Triggers
Para borrar un trigger de la B.D, utilice la sintaxis DROP TRIGGER:
DROP DROP TRIGGER TRIGGER trigger_name trigger_name
3-79
3-80
3-82
3-83
3-84
3-85
3-86
3-87
3-88
Resumen
Procedimiento
xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx
Paquete Declaracin del Procedimiento A Definicin del Procedimiento B Definicin del Procedimiento A
Variable Local
Trigger
3-92