PLSQL 2
PLSQL 2
Lenguaje
Finales
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Motivacin
SQL no permiten expresar de manera declarativa algunas de las operaciones que queremos realizar sobre la base de datos. EL DDL permite denir en funcin del mdelo lgico el esquema de la Base de Datos. El lenguaje de consultas nos permite generar reportes con lgica compleja.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Motivacin
Existen casos donde no podemos expresar restricciones del dominio slo con el DDL. Existen casos en los que necesitamos ejecutar varias acciones SQL de una manera integrada garantizando que se ejecuten como un todo (Deposito entre cuentas, pagar una mercancia, eliminar a un profesor) Adems el lenguaje de consultas no tiene el mismo poder expresivo que un lenguaje imperativo (Clausura transitiva). A veces es simplemente mas fcil hacer las cosas imperativamente (malos hbitos!)
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
PL/SQL
Solucin: Aumentar la base de datos con un lenguaje imperativo (FOR,IF,WHILE,VARIABLES ... :-)) Permitir que el programador utilice dialectos similares a los usados en otros lenguajes para soportar algunas de las restricciones ya mencionadas. Por qu no mantenernos con los lenguajes que ya tenemos? Que tiene de malo Java, C, Python ..
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Java/JDBC/SQL
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
PL/SQL
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Motivacin
Esto es equivalente en otros lenguajes procedurales (C#/ODBC, C++/OCI, Perl/DBI) PLSQL permite reducir el overhead en la red. Simplica aspectos en la programacin (manejo de transacciones) e integra la lgica en un slo servidor. Si el programa que trata con los datos se almacena en el servidor, puede ser compilado y optimizado para mejorar el desempeo Obviamente tiene sus desventajas. (No le crean slo al vendedor de la BD). Criterios de decisin o de diseo se ven el curso de Sistema de Programas
CI3391 PL/SQL Universidad Simn Bolvar
Motivacin
Lenguaje
Finales
PL/SQL: Bloques
Sintaxis similar a la de ADA (Barroco Antiguo), estructurado en bloques. El bloque bsico tiene la forma: DECLARE ..... BEGIN .... EXCEPTION .. END (Declaracin o Inicializacin, Ejecucin, Manejo de Errores) Slo el BEGIN y END son obligatorios. Los bloques se pueden anidar dentro de otros bloques para modularizar el programa. Los bloques se pueden nombrar para almacenarse como funciones y/o procedimientos (ms adelante). Los bloques pueden asociarse a un evento y accin para que sean llamados automaticamente por el manejador (mas adelante)
CI3391 PL/SQL Universidad Simn Bolvar
Motivacin
Lenguaje
Finales
Ejemplo
DECLARE v_nombre VARCHAR(50); c_carnet CONSTANT CHAR(10) DEFAULT '05-00124'; BEGIN select name into v_nombre from estudiante where carnet=c_c DBMS_OUTPUT.PUT_LINE('Hola : ' || v_nombre || '!!'); END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Funciones
CREATE OR REPLACE FUNCTION pname (p1,p2 ..pn) RETURN datatype AS seccion de declaracion BEGIN comandos a ejecutar EXCEPTION manejo de excepciones END; .
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Funciones
Una funcin es un bloque SQL nombrado que retorna un nico valor. Al menos uno de los comandos en el cuerpo de ejecucin debe ser un RETURN. Los parametros tienen la forma parameter_name [mode] datatype donde parameter_name es el nombre del parametro, mode es un valor (IN,OUT,IN OUT) y datatype del tipo de datos. Las funciones pueden ser utilizadas dentro de algunos comandos SQL. Para ser llamadas desde un comando SQL slo pueden tener parametros IN y retornar tipos bsicos.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Funciones
CREATE OR REPLACE FUNCTION mconcat (name IN VARCHAR, lastname IN VARCHAR) RETURN varchar IS BEGIN RETURN lastname || ',' || name; END; select mconcat('eduardo','ruiz') from dual;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Procedimientos Almacenados
CREATE OR REPLACE PROCEDURE pname (p1,p2 ..pn) AS seccion de declaracion BEGIN comandos a ejecutar EXCEPTION manejo de excepciones END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Procedimientos Almacenados
Un procedimiento almacenado no necesita retornar un valor por defecto. Los parametros se declaran de manera similar a las funciones. Los parametros OUT se pueden utilizar para retornar resultados. No se pueden llamar desde SQL. Para ejecutarlas se utiliza el comando EXECUTE nombreProcedimieto
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Procedimientos Almacenados
CREATE PROCEDURE calcula_indice (carnet IN VARCHAR) IS /* Se inicializan las variables necesarias */ BEGIN /* Se selecciona la suma de los creditos inscritos*/ /* Se toma la nota * el nmero de creditos y se suman todos estos productos*/ /* Se actualiza la tabla estudiante */ EXCEPTION /* Se manejan eventos como la division por cero, o el uso de un carnet inexistente */ END; EXECUTE calcula_indice('05-00123')
CI3391 PL/SQL Universidad Simn Bolvar
Motivacin
Lenguaje
Finales
Procedimiento vs Funciones
Las funciones y procedimientos pueden implementar reglas complejas del dominio (actualizar facturaciones, calcular pagos, establecer nuevos indices, marcar estudiantes en periodo de prueba) Si se desea usar el bloque en SQL es mejor usar una funcin. Se estila establecer la lgica en procedimientos organizados en paquetes que pueden ser llamados luego desde las aplicaciones.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Triggers
Las funciones y procedimientos deben ser ejecutados por el usuario. A veces necesitamos que la base de datos reacccione a las acciones que se realizan. Ejemplo: actualizar el indice al insertar una nota nueva. Un trigger es un procedimiento que se ejecuta automaticamente en funcin de un evento y condicin ejecutando una accin. Ejemplo: insertar una nota nmerica calcular indice Usos: atributos derivados, manejar restricciones, seguridad, mantener logs.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Triggers
Un trigger es un bloque PLSQL asociado a una tabla, esquema o base de datos. El mismo se ejecuta cuando ocurre un evento. Puede ejecutarse al ejecutar comandos DML sobre una tabla, al denir datos sobre un esquema, modicar una vista o ejecutar ciertos comandos sobre la base de datos. En nuestro caso nos ocuparemos a triggers que estarn asociados a eventos que ocurren sobre una tabla. Los eventos son: insercciones, eliminaciones o actualizaciones Los triggers pueden ejecutarse antes o despues del evento (Timing) Los triggers pueden ejecutarse una sola vez para toda la tabla o para cada la de la tabla (Granularidad) Hay que revisar siempre las condiciones de cascada.
CI3391 PL/SQL Universidad Simn Bolvar
Motivacin
Lenguaje
Finales
Triggers
CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name PL/SQL BLOCK CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN (condition)] PL/SQL BLOCK
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Timing
El timing puede ser BEFORE o AFTER. Especican cuando se realiza la llamada de la accin El BEFORE se puede chequear antes de la operacin si la misma es posible (se realiza a cierta hora del dia) o derivar un atributo. Con un AFTER se puede revisar el estado nal de la tabla y ver si el mismo es vlido o recalcular un derivado en funcin de la tabla.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Granularidad
Un trigger por las se ejecuta para cada la modicada. Un trigger por comando solo se ejecuta una vez (aunque no se modique nada) Los trigger por las son utiles para las Actualizaciones, eliminaciones o insercciones de varias las. Mas sobre triggers al nal de la clase.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Triggers
CREATE OR REPLACE TRIGGER deriv_seccion AFTER INSERT OR DELETE OR UPDATE ON se_asigna BEGIN /* Actualizar el numero de estudiantes de una seccion sumando los estudiantes de la relacion se_asigna*/ END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Declaracin - Variables
Las variables slo se denen en el bloque de declaracin. ident [CONSTANT] datatype [NOT NULL] [:= | DEFAULT exp]; El nombre de las variables debe ser menor a 30 caracteres. Comienzan con letras y luego caracteres alfanumericos. Por defecto las variables se inicializan en nulo Las variables pueden inicializarse con otras variables, literales o funciones Las variables pueden ser: tipos de datos basicos de oracle + Boolean o compuestos RECORD o CURSOR.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Declaracin - Variables
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Declaracin - Variables
Las variables se inicializan en nulo sino se inicializan explicitamente El nombre de una variable no debe coincidir con una columna (ver estandar de nombres) El alcance de una variable es el bloque donde esta declarada. Las variables de un bloque interno preceden a las variables del bloque externo
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Bloque de ejecucin
Asignacines Llamadas a funciones nativas de Oracle Lmamadas a los comandos INSERT, UPDATE y DELETE Consultas con SELECT Manejo de Transacciones (COMMIT, ROLLBACK) Estructuras de control
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Asignacin
Para asignar el valor a una variable se utiliza el operador de asignacin (:=) con la siguiente sintaxis: Identicador := Expresion Identicador es una variable declarada Expresion puede ser una variable, literal, llamada a funcin, pero no una columna de tabla. Se pueden usar operadores en el lado derecho. v_creditos := v_creditos + 1
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Asignacin
Otra manera de asignar valor a una variable es colocando valores de la Base de Datos dentro de la misma. SELECT select_list INTO variable_name[, variable_name] FROM table El select INTO slo debe retornar un nico resultado. Si es vacio o tiene mas de una respuesta se dispara un error. Los tipos de retorno deben ser compatibles conel tipo de las variables En caso de retornarse ms de una la debe usarse un cursor.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Instrucciones SQL
Se pueden realizar insercciones, actualizaciones y eliminaciones. No se puede llamar a CREATE TABLE, ALTER TABLE o similares (DDL) Se pueden utilizar selecciones multiples (CURSORES)
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Instrucciones SQL
BEGIN /* Actualizar el numero de estudiantes de una seccion sumando los estudiantes de la relacion se_asigna*/ update seccion set num_estudiantes = (select count(*) from se_asigna where seccion.codasig = se_asigna.codasig and seccion.numsec = se_asigna.numsec); END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Condicionales
Condicionales simples: IF-THEN-END IF, IF-THEN-ELSE-END IF, IF-THEN-ELSIF-END IF (Nada relevante) Existen expresiones CASE que no utilizan break y son ms claro que los ELSIF Se debe tener cuidado con la lgica de 3 valores de Oracle (nulos). Una expresin nula siempre es falsa.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Condicionales
DECLARE v_indice ESTUDIANTE.indice.%TYPE; v_condicion VARCHAR2(15); BEGIN SELECT indice INTO v_indice FROM ESTUDIANTE WHERE carnet ='05-1234' IF v_indice < 2 THEN v_condicion ='retirado'; ELSE IF v_indice >= 2 AND v_indice <= 2.39 THEN v_condicion ='periodo prueba'; ELSE v_condicion ='activo'; END IF; END;
CI3391 PL/SQL Universidad Simn Bolvar
Motivacin
Lenguaje
Finales
Instrucciones de Repeticin
Existen tres tipos de ciclos. Loop Basicos, Loop For y Loop While Loop Basico: es un loop innito sin condicin. Loop For: loop controlado por un contador nmerico Loop While: loop con una condicin de salida
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Instrucciones de Repeticin
LOOP instruccin1; instruccin2; .. EXIT [WHEN condicion]; END LOOP;
A menos que se coloque la instruccin EXIT se queda en un ciclo innito. La misma no tiene que estar necesariamente al nal.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Instrucciones de Repeticin
FOR counter IN lower..upper LOOP instruccin1; instruccin2; .. END LOOP;
El contador es una variable entera que aumenta o disminuye de uno en uno. La misma se declara implicitamente y tiene alcance en el bucle.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Instrucciones de Repeticin
WHILE condition LOOP LOOP instruccin1; instruccin2; .. END LOOP;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
DECLARE TYPE tipo_reg_estudiante IS RECORD (nombre VARCHAR2(50), carrera CHAR(3), carnet CHAR(7) indice ESTUDIANTE.indice%TYPE ); r_est tipo_reg_estudiante; BEGIN reg_est.carnet := '05-00123'; select apynombre,idcarrera,carnet, indice into r_est from estudiante where carnet = '05-00124'; END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
%ROWTYPE
Se puede declarar un registro del mismo tipo que la la de una tabla o vista de la Base de Datos Para esto se utiliza la siguiente sintaxis: nombretabla%ROWTYPE Los campos del registro toman sus nombres y tipos de datos de las columnas de la tabla o vista. Utiles en el caso de hacer selecciones '*'
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
%ROWTYPE
DECLARE r_est ESTUDIANTE%ROWTYPE;; BEGIN select * into r_est from estudiante where carnet = '05-00124'; DBMS_OUT.PUT_LINE('Nombre:' || r_est.apynombre); END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores
Hasta el momento hemos visto como asignar una la en un SELECT. La pregunta es: Podemos manejar varias las y manejarlas en un BUCLE? La respuesta es: Armativo, pero primero tenemos que saber que es un cursor.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores
Un cursor es un rea privada en memoria donde se procesa y se ejecuta un comando SQL (Asi de cruel) Dos tipos de cursores:
Un cursor implicito se abre al ejecutar un comando SQL y se cierra inmediatamente al nalizar el mismo. Un cursor explicito es declarado y controlado por el usuario.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Implicitos
No tenemos control sobre los cursores implicitos. Sin embargo tenemos atributos para ver informacin del cursor: SQL%ROWCOUNT para saber el nmero de las modicadas, SQL%FOUND para saber si afecto al menos una la, SQL%NOTFOUND para saber si no afecto ninguna la
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Explicitos
Tenemos el control completo sobre la ejecucin del comando. Los cursores explicitos permiten acceder una a una las las retornadas por un select de multiples las (ResultSet). El cursor es una especie apuntador que se mueve para acceder la a la (Current Row) El programador es responsable de declarar el cursor, abrirlo, cargar la a la y cerrarlo (hay que hacerlo a pata)
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Explicitos
Para declarar el cursor se usa la siguiente sintaxis: CURSOR name_cursor IS select_stmt Para abrir el cursor se utiliza la sintaxis: OPEN name_cursor. El cursor reserva la memoria, parsea el select y ejecuta el mismo para cargar la zona activa de memoria. Para cargar una la: FETCH name_cursor INTO v1,..vn | name_record. Esto se hace en el bucle. Se puede utilizar el atributo name_cursor%NOTFOUND para decidir si el FETCH retorno algo Para cerrar: CLOSE name_cursor. Muy importante ya que libera los recursos.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Explicitos
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Explicitos
Manipular directamente el cursor es demasiado verbose y MUY peligroso. Una manera ms sencilla de manejar los cursores es con la forma: FOR name_record IN cursor_name LOOP stmt END LOOP; . Este ciclo abre y cierra el cursor implicitamente. El registro que se utiliza NO se declara. Tambien se puede utilizar la forma FOR name_record IN selectstmt LOOP stmt END LOOP; sin declarar los mismos al momento de ejecucin
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
PL/SQL
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Explicitos
'Asigne a todos los estudiantes de la carrera '001' a la seccin 1 de la asignatura 'AA0001'
DECLARE CURSOR e1 IS SELECT * FROM ESTUDIANTE WHERE idcarrera = '001'; BEGIN FOR reg_est IN e1 LOOP INSERT INTO ASIGNA VALUES (e1.carnet,'AA0001',1); END LOOP; END;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Actualualizables
A veces queremos actualizar la la que estamos revisando La clausula FOR UPDATE permite al usuario bloquear las las utilizadas por el cursor para su actualizacin o eliminacin. La sintaxis de declaracin es CURSOR name_cursor IS select_stmt FOR UPDATE [NOWAIT] Al bloquear las las con el FOR UPDATE las mismas pueden ser actualizadas con los comandos UPDATE y DELETE de SQL. Para referirse a la la a la cual apunta el cursor en la clausula WHERE de estos comandos se utiliza la sintaxis WHERE CURRENT OF name_cursor;
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Cursores Explicitos
DECLARE v_credins ESTUDIANTE.credins.%TYPE; CURSOR e1 IS SELECT * FROM ESTUDIANTE FOR UPDATE; BEGIN FOR reg_est IN e1 LOOP SELECT SUM(creditos) INTO v_credins FROM SE_ASIGNA S, ASIGNATURA A WHERE S.carnet = e1.carnet AND S.codasig = A.codasig; IF SQL%FOUND THEN UPDATE ESTUDIANTE SET credins = v_credins WHERE CURRENT OF e1; END IF; END LOOP; END;
CI3391 PL/SQL Universidad Simn Bolvar
Motivacin
Lenguaje
Finales
Cursores Explicitos
Hay que ser muy cuidadoso con los cursores explicitos Hay que cuidar que liberen los recursos efectivamente. En la mayora de los casos son ms lentos que el comando SQL alternativo. Requieren de mas esfuerzo de programacin y mantenimiento. Tienen efectos colaterales importantes como el bloqueo de las.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Manejo de Excepciones
Una excepcin es un identicador que se dispara durante la ejecucin. Puede ser disparador por oracle o ser disparado explicitamente por el usuario. La excepcin puede ser capturada por el bloque o se puede dejar que la misma siga propagandose.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Manejo de Excepciones
Tres tipos de excepciones: Las excepciones predenidas estn declaradas en el paquete STANDARD. Las mas importantes son NOT_DATA_FOUND y TOO_MANY_ROWS En algunos casos se pueden denir excepciones que se asocien a los errores estandar de oracle. Estas excepciones se deben declarar explicitamente y se deben asociar con la clausula PRAGMA EXCEPTION_INIT. Este tipo de excepciones se pueden utilizar para capturar los errores en el DML. Las excepciones de usuario se disparan con el comando RAISE en el bloque de ejecucin. Se pueden utilizar las funciones SQLCODE y SQLERRM para acceder a los valores de la excepcin lanzada por Oracle en el bloque de excepciones.
Universidad Simn Bolvar
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Excepciones
DECLARE v_nombre persona.name%TYPE; c_carnet persona.ci%TYPE DEFAULT '05-00123'; e_unique EXCEPTION; PRAGMA EXCEPTION_INIT (e_unique,-1); BEGIN INSERT INTO persona VALUES (c_carnet,v_nombre); select name into v_name from estudiante; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('No puedes meter ms de una fila en un WHEN e_unique THEN DBMS_OUTPUT.PUT_LINE('Error de unicidad capturado con PRAGMA WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE); CI3391 Universidad Simn Bolvar END; PL/SQL
Motivacin
Lenguaje
Finales
Ultimos consejos
Para imprimir recuerden el comando DBMS_OUTPUT.PUT_LINE('Hola'). La variable SET SERVEROUTPUT ON; debe estar seteada en PL/SQL. Recuerden usar CREATE OR REPLACE para que se sobreescriba el ltimo trigger, funcin o procedimiento. El comando SHOW ERRORS muestra los errores de la ltima compilacin. El lenguaje es feo y el compilador es poco amigable, paciencia.
CI3391 PL/SQL
Motivacin
Lenguaje
Finales
Conclusiones
PL/SQL permite crear programas imperativos en Oracle Tiene un acceso directo e integrado a los recursos del manejador. Tiene estructuras de control imperativa, facilitando las tareas que eran imposibles o complicadas con SQL. Las funciones y procedimientos implementan la lgica de negocio de una manera central en la BD. Los triggers ayudan a mantener la base de datos en un estado correcto. Se debe evitar ser imperativo cuando se puede ser declarativo. El lenguaje es espantoso y poco amigable
CI3391 PL/SQL