0% encontró este documento útil (0 votos)
66 vistas

PLSQL 2

Este documento presenta una introducción a PL/SQL. Explica que PL/SQL se creó para permitir expresar restricciones y lógica compleja de forma imperativa dentro de una base de datos. Describe características clave como procedimientos almacenados, funciones y triggers, y provee ejemplos simples de su sintaxis. El objetivo general es familiarizar a los lectores con los conceptos básicos de PL/SQL y sus usos comunes dentro de una base de datos.

Cargado por

Jorge Antonio
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
66 vistas

PLSQL 2

Este documento presenta una introducción a PL/SQL. Explica que PL/SQL se creó para permitir expresar restricciones y lógica compleja de forma imperativa dentro de una base de datos. Describe características clave como procedimientos almacenados, funciones y triggers, y provee ejemplos simples de su sintaxis. El objetivo general es familiarizar a los lectores con los conceptos básicos de PL/SQL y sus usos comunes dentro de una base de datos.

Cargado por

Jorge Antonio
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 58

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

Procedimientos Almacenados, Funciones y Triggers


Laboratorio de Base de Datos (CI3391)
Departamento de Computacin y Tecnologa de la Informacin Universidad Simn Bolvar Sartenejas, Venezuela

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

Java/JDBC/SQL

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

PL/SQL

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

Declaracin - Variables

v\_ingreso v\_carrera v\_salon c\_credmax

DATE; NUMBER(4) NOT NULL; VARCHAR2(13) :='MEM-001'; CONSTANT NUMBER := 8;

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

Declaracin - El atributo %type


El atributo %type permite declarar una variable en funcin del tipo de una columna de la base de datos o en funcin de otra variable denida anteriormente Ejemplo: v_credins ESTUDIANTE.credins.%TYPE; Ayuda al mantenimiento de los procedimientos y funciones (cambios de tipo de datos)

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

Instrucciones de Repeticin
WHILE condition LOOP LOOP instruccin1; instruccin2; .. END LOOP;

Un while comn y silvestre.

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

Tipos de Datos Complejos


Un RECORD es un conjunto de datos compuesto por uno o mas campos escalares o registros anidados. Los registros deben ser declarados al inicio del bloque La estructura es similar a la utilizada en Pascal o C. Los registros son ideales para acceder a varias columnas. Para usar un registro tenemos que primero denir el mismo y luego denir cada una de las variables que tienen el tipo del registro.

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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'; reg_est ESTUDIANTE.%ROWTYPE; BEGIN OPEN e1; FETCH e1 INTO reg_est; WHILE e1.%FOUND LOOP INSERT INTO ASIGNA VALUES(e1.carnet,'AA0001',1); FETCH e1 INTO reg_est; END LOOP; CLOSE e1; END;

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

Lenguaje

Finales

PL/SQL

CI3391 PL/SQL

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

Motivacin

PL/SQL - Aspectos Bsicos

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

Universidad Simn Bolvar

También podría gustarte