Вы находитесь на странице: 1из 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL PL/SQL es un lenguaje procedimental estructurado en bloques que ampla la funcionalidad de SQL.

Con PL/SQL podemos usar sentencias SQL para manipular datos y sentencias de control de flujo para procesar los datos. Por tanto, PL/SQL combina la potencia de SQL para la manipulacin de datos, con la potencia de los lenguajes procedimentales para procesar los datos. Aunque PL/SQL fue creado por Oracle, hoy da todos los gestores de bases de datos utilizan un lenguaje procedimental muy parecido al ideado por Oracle para poder programar las bases de datos. Como veremos, en PL/SQL podemos definir variables, constantes, funciones, procedimientos, capturar errores en tiempo de ejecucin, anidar cualquier nmero de bloques, etc. como solemos hacer en cualquier otro lenguaje de programacin. Adems, por medio de PL/SQL programaremos los disparadores de nuestra base de datos, tarea que no podramos hacer slo con SQL. Una de las grandes ventajas que nos ofrece PL/SQL es un mejor rendimiento en entornos de red clienteservidor, ya que permite mandar bloques PL/SQL desde el cliente al servidor a travs de la red, reduciendo de esta forma el trfico y as no tener que mandar una a una las sentencias SQL correspondientes. Una vez vistas las caractersticas generales de PL/SQL, nos centraremos en sus elementos principales: unidades lxicas, tipos de datos, variables, operadores, estructuras de control y su uso en procedimientos y funciones. A).- UNIDADES LXICAS Al igual que en nuestra lengua podemos distinguir diferentes unidades lxicas como palabras, signos de puntuacin, etc. En los lenguajes de programacin tambin existen diferentes unidades lxicas que definen los elementos ms pequeos que tienen sentido propio y que al combinarlos de manera adecuada, siguiendo las reglas de sintaxis, dan lugar a sentencias vlidas sintcticamente. PL/SQL es un lenguaje no sensible a las maysculas, por lo que ser equivalente escribir en maysculas o minsculas, excepto cuando hablemos de literales de tipo cadena o de tipo carcter. Cada unidad lxica puede estar separada por espacios (debe estar separada por espacios si se trata de 2 identificadores), por saltos de lnea o por tabuladores para aumentar la legibilidad del cdigo escrito. Las unidades lxicas se pueden clasificar en: Delimitadores. Identificadores. Literales. Comentarios.

Delimitadores. PL/SQL tiene un conjunto de smbolos denominados delimitadores utilizados para representar operaciones entre tipos de datos, delimitar comentarios, etc. En la siguiente tabla puedes ver un resumen de los mismos. Delimitadores Simples. Smbolo. Significado. + Suma. % Indicador de atributo. . Selector. / Divisin. Delimitadores en PL/SQL. Delimitadores Compuestos. Smbolo. Significado. ** Exponenciacin. <> Distinto. = Distinto. <= Menor o igual.

Pg. 1 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL Delimitadores Simples. Delimitador de lista. Delimitador de lista. Variable host. Separador de elementos. Producto. Delimitador de identificador acotado. Igual relacional. Menor. Mayor. Indicador de acceso remoto. Terminador de sentencias. Resta/negacin. Delimitadores Compuestos. Mayor o igual. Rango. Concatenacin. Delimitador de etiquetas. Delimitador de etiquetas. Comentario de una lnea. Comentario de varias lneas. Comentario de varias lneas. Asignacin. Selector de nombre de parmetro.

( ) : , * " = < > @ ; -

>= .. || << >> -/* */ := =>

Identificadores. Los identificadores en PL/SQL, como en cualquier otro lenguaje de programacin, son utilizados para nombrar elementos de nuestros programas. A la hora de utilizar los identificadores debemos tener en cuenta los siguientes aspectos: Un identificador es una letra seguida opcionalmente de letras, nmeros, $, _, #. No podemos utilizar como identificador una palabra reservada. Ejemplos vlidos: X, A1, codigo_postal. Ejemplos no vlidos: rock&roll, on/off. PL/SQL nos permite adems definir los identificadores acotados, en los que podemos usar cualquier carcter con una longitud mxima de 30 y deben estar delimitados por ". Ejemplo: "X*Y". En PL/SQL existen algunos identificadores predefinidos y que tienen un significado especial ya que nos permitirn darle sentido sintctico a nuestros programas. Estos identificadores son las palabras reservadas y no las podemos utilizar como identificadores en nuestros programas. Ejemplo: IF, THEN, ELSE ... Algunas palabras reservadas para PL/SQL no lo son para SQL, por lo que podramos tener una tabla con una columna llamada 'type' por ejemplo, que nos dara un error de compilacin al referirnos a ella en PL/SQL. La solucin sera acotarlos. SELECT "TYPE" Literales. Los literales se utilizan en las comparaciones de valores o para asignar valores concretos a los identificadores que actan como variables o constantes. Para expresar estos literales tendremos en cuenta que: Los literales numricos se expresarn por medio de notacin decimal o de notacin exponencial. Ejemplos: 234, +341, 2e3, -2E-3, 7.45, 8.1e3. Los literales tipo carcter y tipo cadena se deben delimitar con unas comillas simples. Los literales lgicos son TRUE y FALSE. El literal NULL que expresa que una variable no tiene ningn valor asignado.

Pg. 2 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL Comentarios. En los lenguajes de programacin es muy conveniente utilizar comentarios en mitad del cdigo. Los comentarios no tienen ningn efecto sobre el cdigo pero s ayudan mucho al programador o la programadora a recordar qu se est intentando hacer en cada caso (ms an cuando el cdigo es compartido entre varias personas que se dedican a mejorarlo o corregirlo). En PL/SQL podemos utilizar dos tipos de comentarios: Los comentarios de una lnea se expresaran por medio del delimitador --. Ejemplo:
a:=b; --asignacin

Los comentarios de varias lneas se acotarn por medio de los delimitadores /* y */. Ejemplo:
/* Primera lnea de comentarios. Segunda lnea de comentarios. */

B).- TIPOS DE DATOS. VARIABLES Y CONSTANTES En PL/SQL contamos con todos los tipos de datos simples utilizados en SQL y algunos ms. En este apartado vamos a enumerar los ms utilizados. Numricos. BINARY_INTEGER: Tipo de dato numrico cuyo rango es de -2147483647 .. 2147483647. PL/SQL adems define algunos subtipos de ste: NATURAL, NATURALN, POSITIVE, POSITIVEN, SIGNTYPE. NUMBER: Tipo de dato numrico para almacenar nmeros racionales. Podemos especificar su escala (-84 .. 127) y su precisin (1 .. 38). La escala indica cundo se redondea y hacia dnde. Ejemplos. escala=2: 8.234 -> 8.23, escala=-3: 7689 -> 8000. PL/SQL tambin define algunos subtipos como: DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INT, NUMERIC, REAL, SMALLINT. PLS_INTEGER: Tipo de datos numrico cuyo rango es el mismo que el del tipo de dato BINARY_INTEGER, pero que su representacin es distinta por lo que las operaciones aritmticas llevadas a cabo con los mismos sern ms eficientes que en los dos casos anteriores. Alfanumricos. CHAR(n): Array de n caracteres, mximo 2000 bytes. Si no especificamos longitud sera 1. LONG: Array de caracteres con un mximo de 32760 bytes. RAW: Array de bytes con un nmero mximo de 2000. LONG RAW: Array de bytes con un mximo de 32760. VARCHAR2: Tipo de dato para almacenar cadenas de longitud variable con un mximo de 32760.

Grandes objetos. BFILE: Puntero a un fichero del Sistema Operativo. BLOB: Objeto binario con una capacidad de 4 GB. CLOB: Objeto carcter con una capacidad de 2 GB.

Pg. 3 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL Otros. BOOLEAN: TRUE/FALSE. DATE: Tipo de dato para almacenar valores da/hora desde el 1 enero de 4712 a.c. hasta el 31 diciembre de 4712 d.c. Hemos visto los tipos de datos simples ms usuales. Los tipos de datos compuestos los dejaremos para posteriores apartados. VARIABLES Y CONSTANTES: nombre_vble tipo [NOT NULL] [:= || DEFAULT valor]; Para cada variable se debe especificar el tipo. Si no se inicilizan, se garantiza que su valor es NULL. La opcin NOT NULL fuerza a que la variable tenga siempre un valor. Si se usa, se deber inicializar la variable con DEFAULT o con := . Cuando declaramos una constante siempre se deber asignar un valor: nombre_constante CONSTANT tipo := valor;
id SMALLINT; hoy DATE := sysdate; pi CONSTANT REAL:= 3.1415; id SMALLINT NOT NULL; id SMALLINT NOT NULL := 9999;

--ilegal, no est inicializada --legal

Atributos %TYPE y %ROWTYPE:

%TYPE declara una variable del mismo tipo que otra o que una columna de una tabla. %ROWTYPE declara una variable de registro cuyos campos se corresponden con las columnas de una tabla o vista de B.D. Para hacer referencia a cada uno de los campos indicaremos el nombre de la variable, un punto y el nombre del campo que coincide con el de la columna correspondiente. Por ejemplo: puesto emple.oficio%TYPE; empleado emple%ROWTYPE; DBMS_OUTPUT.PUT_LINE(empleado.oficio); mbito y visibilidad de las variables:

El mbito de una variable incluye el bloque en el que se declara y sus bloques hijos. Una variable declarada en un bloque ser local para el bloque en el que ha sido declarada y global para los bloques hijos de ste. Las variables declaradas en los bloques hijos no son accesibles desde el bloque padre.

Pg. 4 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL

C).- OPERADORES: Asignacin := Concatenacin || Comparacin =, !=, <, >, <=, >=, IN, IS NULL, LIKE, BETWEEN, Aritmticos +, -, *, /, ** (potencia). Lgicos AND, OR, NOT. Prioridad: 1 2 3 4 5 ** , NOT *, / + , -, || =, !=, <, >, <=, >=, IN, IS NULL, LIKE, BETWEEN AND

6 OR En PL/SQL se pueden utilizar todas las funciones de SQL.

D).- EL BLOQUE PL/SQL La unidad bsica en PL/SQL que es el bloque. Un bloque PL/SQL consta de tres zonas: Declaraciones: definiciones de variables, constantes, cursores y excepciones. Proceso: zona donde se realizar el proceso en s, conteniendo las sentencias ejecutables. Excepciones: zona de manejo de errores en tiempo de ejecucin. La sintaxis es la siguiente:
[DECLARE [Declaracin de variables, constantes, cursores y excepciones]] BEGIN [Sentencias ejecutables] [EXCEPTION Manejadores de excepciones] END;

Los bloques PL/SQL pueden anidarse a cualquier nivel. Como hemos comentado anteriormente el mbito y la visibilidad de las variables es la normal en un lenguaje procedimental. Por ejemplo, en el siguiente fragmento de cdigo se declara la variable aux en ambos bloques, pero en el bloque anidado aux con valor igual a 10 acta de variable global y aux con valor igual a 5 acta como variable local, por lo que en la comparacin evaluara a FALSE, ya que al tener el mismo nombre la visibilidad dominante sera la de la variable local.

Pg. 5 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL

DECLARE aux number := 10; BEGIN DECLARE aux number := 5; BEGIN ... IF aux = 10 THEN ... END; END;

--evala a FALSE, no entrara

E).- SOPORTE PARA RDENES DE MANIPULACIN DE DATOS Y CONSULTAS: Desde PL/SQL se puede ejecutar cualquier orden de manipulacin de datos: insercin, modificacin y borrado de tuplas. Tambin permite ejecutar cualquier consulta admitida por la base de datos. Pero cuando se ejecuta la consulta, el resultado no se muestra automticamente en el terminal del usuario sino que se queda en un rea de memoria denominada cursor a la que accederemos utilizando variables. SELECT COUNT(*) FROM emple; ERROR SELECT COUNT(*) INTO total_emple FROM emple; Se ejecuta la consulta y se deposita el resultado en la variable total_emple, que suponemos declarada previamente. A este tipo de cursores se denominan cursores implcitos porque no hay que declararlos. Es el tipo ms sencillo pero tiene ciertas limitaciones: la consulta deber devolver una nica fila, pues en caso contrario se producir un error catalogado como TOO_MANY_ROWS. El formato bsico es: SELECT <columna/s> INTO <variable/s> FROM <tabla> WHERE Las variables que siguen a INTO reciben el valor de la consulta, por tanto, debe haber coincidencia en el tipo con las columnas especificadas en la clusula SELECT. F).- INTERACCIN CON EL USUARIO EN PL/SQL: PL/SQL es un lenguaje diseado para trabajar con la base de datos y manejar grandes volmenes de informacin de manera eficaz, pero no ha sido concebida para interactuar con el usuario. No dispone de rdenes para la captura de datos introducidos por teclado ni tampoco para visualizar datos en pantalla. No obstante, Oracle incorpora el paquete DBMS_OUTPUT con fines de depuracin, . Este incluye entre otros el procedimiento PUT_LINE que permite visualizar textos en pantalla. DBMS_OUTPUT.PUT_LINE (<expresin>); Para que funcione correctamente, la variable de entorno SERVEROUTPUT deber estar en ON. Para cambiar el estado de la variable introduciremos al comienzo de la sesin: SET SERVEROUTPUT ON

Pg. 6 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL

Para pasar datos a un programa podemos recurrir a una de las siguientes opciones: Introducir datos en una tabla desde SQL*Plus y despus leerlos desde el programa. Pasar los datos como parmetros en la llamada. Utilizar variables de sustitucin. Esta opcin slo es vlida con bloques annimos. G).- ESTRUCTURAS DE CONTROL: ESTRUCTURAS DE CONTROL ALTERNATIVAS ALTERNATIVA SIMPLE IF condicin THEN instrucciones; END IF; ALTERNATIVA DOBLE IF condicin THEN instrucciones1; ELSE instrucciones2; END IF; ALTERNATIVA MLTIPLE:CASE COMPROBACIN CASE expresin WHEN valor THEN instrucciones1; WHEN valor THEN instrucciones2; WHEN valor THEN instrucciones3; ... [ELSE instrucciones_otras;] END CASE; CASE var WHEN 1 THEN instrucciones1; WHEN 2 THEN instrucciones2; WHEN 3 THEN instrucciones3; ... [ELSE instrucciones_otras;] END CASE;

ALTERNATIVA MLTIPLE CON ELSIF IF condicin1 THEN instrucciones1; ELSIF condicin2 THEN instrucciones2; ELSIF condicin3 THEN instrucciones3; ... [ELSE instrucciones_otras;] END IF;

ALTERNATIVA MLTIPLE:CASE DE BSQUEDA CASE WHEN condicin1 THEN instrucciones1; WHEN condicin2 THEN instrucciones2; WHEN condicin3 THEN instrucciones3; ... [ELSE instrucciones_otras;] END CASE; CASE WHEN var = 1 THEN instrucciones1; WHEN var = 2 THEN instrucciones2; WHEN var = 3 THEN instrucciones3; ... [ELSE instrucciones_otras;] END CASE;

Ejercicio.Realizar un bloque que nos permita modificar el salario de un empleado (cuyo cdigo, empl_no, recibiremos como parmetro de entrada) en funcin del nmero de empleados que tiene a su cargo: Si no tiene ninguno: se le aumentar el sueldo en 50 euros. Si tiene 1: en 80 euros. Si tiene 2: en 100 euros. Pg. 7 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL Si tiene 3 o ms: en 120. Adems si el empleado es PRESIDENTE (campo oficio) se le incrementar el salario en 30 euros ms. Notas importantes: 1.- Realizar 3 versiones del procedimiento para cada tipo de alternativa mltiple. 2.- El procedimiento modifica la tabla EMPLE. 3.- Para saber el nmero de empleados que tiene a su cargo habr que contar cuntos tuplas tienen dicho cdigo de empleado en el campo dir. ESTRUCTURAS DE CONTROL REPETITIVAS ITERAR LOOP instrucciones EXIT [WHEN condicin]; instrucciones; END LOOP; MIENTRAS WHILE condicin LOOP instrucciones END LOOP; PARA FOR variable_control IN [REVERSE] valor_inicio..valor_final LOOP instrucciones; END LOOP; La variable de control se declara de forma implcita como variable local al bucle. Esta variable tomar, en primer lugar, el valor especificado en valor_inicio, incrementndose en 1 en cada iteracin hasta alcanzar el valor especificado en valor_final. El incremento siempre es de una unidad, pero puede ser en orden inverso especificando IN REVERSE. Se evala la condicin y si se cumple se ejecutan las instrucciones. El bucle seguir ejecutndose mientras se cumpla la condicin. Es una condicin de continuacin. Bucle que se repetir indefinidamente hasta que encuentre la instruccin EXIT sin condicin o hasta que se cumpla la condicin asociada al EXIT WHEN. Es una condicin de salida.

Ejercicio 1.Realizar un bloque PL/SQL que dada una cadena que contiene los dos apellidos de una persona, guarde el primer apellido en una variable que denominaremos v_1apell. Se entiende que el primer apellido termina cuando encontremos un carcter distinto de los alfabticos en maysculas. Realizar 2 versiones del procedimiento: Utilizando WHILE y LOOP. Ejercicio 2.Realizar de 2 formas distintas un bloque PL/SQL que escriba la cadena HOLA al revs (utilizando primero un bucle FOR y luego un bucle WHILE) Pg. 8 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL H).- CONTROL DE ERRORES: EXCEPCIONES. Cualquier situacin de error es llamada excepcin en PL/SQL. Cuando se detecta un error, una excepcin es lanzada, es decir, la ejecucin normal se para y el control se transfiere a la parte de manejo de excepciones. La parte de manejo de excepciones es la parte etiquetada como EXCEPTION y constar de sentencias para el manejo de dichas excepciones, llamadas manejadores de excepciones. Manejadores de excepciones. Sintaxis.
DECLARE supervisor agentes%ROWTYPE; BEGIN EXCEPTION WHEN nombre_excepcion THEN <sentencias para su manejo> .... WHEN OTHERS THEN <sentencias para su manejo> EXCEPTION WHEN NO_DATA_FOUND THEN --Manejamos el no haber encontrado datos WHEN OTHERS THEN --Manejamos cualquier error inesperado END; SELECT * INTO supervisor FROM agentes WHERE categoria = 2 AND oficina = 3; ...

Ejemplo.

La parte OTHERS captura cualquier excepcin no capturada. Las excepciones pueden estar definidas por el usuario o definidas internamente. Las excepciones predefinidas se lanzarn automticamente asociadas a un error de Oracle. Las excepciones definidas por el usuario debern definirse y lanzarse explcitamente. Excepciones predefinidas ms frecuentes: NO_DATA_FOUND: Una orden de tipo SELECT INTO no ha devuelto ningn valor. TOO_MANY_ROWS: Una orden de tipo SELECT INTO ha devuelto ms de una fila. DUP_VAL_ON_INDEX: ndice nico violado.

Pg. 9 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL En PL/SQL nosotros podemos definir nuestras propias excepciones en la parte DECLARE de cualquier bloque. Estas excepciones podemos lanzarlas explcitamente por medio de la sentencia RAISE nombre_excepcin. Excepciones definidas por el usuario. Sintaxis. Ejemplo.
DECLARE categoria_erronea EXCEPTION; BEGIN DECLARE ... nombre_excepcion EXCEPTION; IF categoria<0 OR categoria>3 THEN BEGIN RAISE categoria_erronea; ... END IF; RAISE nombre_excepcion; ... ... EXCEPTION END; WHEN categoria_erronea THEN --manejamos la categoria errnea END;

Ahora que ya sabemos lo que son las excepciones, cmo capturarlas y manejarlas y cmo definir y lanzar las nuestras propias. Es la hora de comentar algunos detalles sobre el uso de las mismas. El alcance de una excepcin sigue las mismas reglas que el de una variable, por lo que si nosotros redefinimos una excepcin que ya es global para el bloque, la definicin local prevalecer. Las excepciones predefinidas estn definidas globalmente. No necesitamos (ni debemos) redefinir las excepciones predefinidas. Cuando manejamos una excepcin no podemos continuar por la siguiente sentencia a la que la lanz.
DECLARE ... BEGIN ... INSERT INTO familias VALUES (id_fam, nom_fam, NULL, oficina); INSERT INTO agentes VALUES (id_ag, nom_ag, login, password, 0, 0, id_fam, NULL); ... EXCEPTION WHEN DUP_VAL_ON_INDEX THEN --manejamos la excepcin debida a que el nombre de la familia ya existe, --pero no podemos continuar por el INSERT INTO agentes END;

Pg. 10 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL Pero s podemos encerrar la sentencia dentro de un bloque, y ah capturar las posibles excepciones, para continuar con las siguientes sentencias.
DECLARE id_fam NUMBER; nom_fam VARCHAR2(40); oficina NUMBER; id_ag NUMBER; nom_ag VARCHAR2(60); usuario VARCHAR2(20); clave VARCHAR2(20); BEGIN ... BEGIN INSERT INTO familias VALUES (id_fam, nom_fam, NULL, oficina); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN SELECT identificador INTO id_fam FROM familias WHERE nombre = nom_fam; END; INSERT INTO agentes VALUES (id_ag, nom_ag, login, password, 1, 1, id_fam, null); ... END;

Si la excepcin es capturada por un manejador de excepcin apropiado, sta es tratada y posteriormente el control es devuelto al bloque superior. Si la excepcin no es capturada y no existe bloque superior, el control se devolver al entorno. Tambin puede darse que la excepcin sea manejada en un bloque superior a falta de manejadores para ella en los bloques internos, la excepcin se propaga de un bloque al superior y as hasta que sea manejada o no queden bloques superiores con lo que el control se devuelve al entorno. Oracle tambin permite que nosotros lancemos nuestros propios mensajes de error a las aplicaciones y asociarlos a un cdigo de error que Oracle reserva, para no interferir con los dems cdigos de error. Lo hacemos por medio del procedimiento:
RAISE_APPLICATION_ERROR(error_number, message);

Donde error_number es un entero negativo comprendido entre 20000..-20999 y message es una cadena que devolvemos a la aplicacin. Ejercicio.Bloque PL/SQL que reciba por teclado un nmero de empleado y una cantidad, el programa aumentar en la cantidad especificada el sueldo al empleado. Utilizaremos dos excepciones, una definida por el usuario salario_nulo y la otra predefinida NO_DATA_FOUND.

Pg. 11 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL I).- SUBPROGRAMAS: PROCEDIMIENTOS Y FUNCIONES: Los subprogramas son bloques PL/SQL que tienen un nombre y pueden recibir y devolver valores. En todo subprograma podemos distinguir: La cabecera, que contiene: Nombre, los parmetros con sus tipos (opcional) y el tipo de valor de retorno (slo para funciones). El cuerpo del subprograma, es un bloque que incluye: declaraciones de variables locales (opcional), instrucciones y manejo de excepciones (opcional). Hay 2 tipos de subprogramas: procedimientos y funciones. PROCEDIMIENTOS FUNCIONES PROCEDURE nombre_procedimiento [lista_parmetros] IS [declaraciones;] BEGIN instrucciones; [EXCEPTION excepciones;] END [nombre_procedimiento]; FUNCTION nombre_funcin [lista_parmetros] RETURN tipo IS [declaraciones;] BEGIN instrucciones; RETURN expresin; [EXCEPTION excepciones;] END [nombre_funcin];

Para crear un procedimiento/funcin: PROCEDIMIENTOS CREATE OR REPLACE PROCEDURE nombre_procedimiento [lista_parmetros] AS [declaraciones;] BEGIN instrucciones; [EXCEPTION excepciones;] END [nombre_procedimiento]; FUNCIONES CREATE OR REPLACE FUNCTION nombre_funcin [lista_parmetros] RETURN tipo AS [declaraciones;] BEGIN instrucciones; RETURN expresin; [EXCEPTION excepciones;] END [nombre_funcin];

Por motivos de legibilidad, se utilizar AS en lugar de IS al crear un procedimiento o funcin. A efectos del compilador se puede utilizar cualquiera de las dos. Los subprogramas se pueden invocar desde otro bloque o subprograma. Para ello escribiremos el nombre del subprograma seguido de la lista de parmetros entre parntesis (si y slo si el subprograma tuviese definidos parmetros). La llamada a un subprograma es una instruccin por s misma. Cuando se produce la llamada el control de la ejecucin pasa al subprograma llamado hasta que finalice su ejecucin, despus el control volver a la instruccin siguiente a su llamada. Pg. 12 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL

- Llamada a un procedimiento: nombre_procedimiento [(lista_parmetros)]; - Llamada a una funcin: variable:= nombre_funcin [(lista_parmetros)]; o bien podemos hacer algo con el valor que devuelve, p.e. Mostrarlo por pantalla: DBMS_OUTPUT.PUT_LINE (nombre_funcin [(lista_parmetros)]); Ejercicio1.Crear un procedimiento que reciba un nmero de empleado y una cadena correspondiente a su nuevo oficio. El procedimiento deber localizar el empleado, modificar el oficio y visualizar los cambios realizados (el oficio anterior y el nuevo del empleado en cuestin).
CREATE OR REPLACE PROCEDURE CAMBIAROFICIO( NUM_EMPLE NUMBER, NUEVO_OFICIO VARCHAR2) /* EN LOS PARMETROS NO SE ESPECIFICA TAMAO SLO TIPO*/ AS OFICIO_ANT EMPLE.OFICIO%TYPE; BEGIN SELECT OFICIO INTO OFICIO_ANT FROM EMPLE WHERE EMP_NO= NUM_EMPLE; UPDATE EMPLE SET OFICIO= NUEVO_OFICIO WHERE EMP_NO=NUM_EMPLE; DBMS_OUTPUT.PUT_LINE('EMPLEADO: '||NUM_EMPLE||' OFICIO ANTERIOR: '||OFICIO_ANT||' NUEVO OFICIO: '||NUEVO_OFICIO); END CAMBIAROFICIO;

/ Ya tenemos el procedimiento creado y almacenado en la base de datos. Para ejecutarlo tenemos dos opciones: 1. Podemos llamarlo desde otro subprograma o bloque annimo: BEGIN CAMBIAROFICIO(7902,'DIRECTOR'); END; 2. Lo ejecutamos directamente con la funcin EXECUTE: EXECUTE CAMBIAROFICIO (7902, 'DIRECTOR'); Ejercicio2Crear un procedimiento que utilizando el procedimiento creado en el ejercicio anterior, localice al empleado con mayor sueldo y modifique su funcin a DIRECTOR.

Pg. 13 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL Ejercicio3.Crea una funcin que dado un determinado departamento devuelva el total de los salarios de los empleados pertenecientes a dicho departamento. No utilizar la funcin SUM.
CREATE FUNCTION SALARIO_TOTAL_DPTO (DNO NUMBER) RETURN NUMBER AS SALARIO_TOTAL NUMBER; BEGIN SALARIO_TOTAL := 0; FOR SAL_EMP IN (SELECT SALARIO FROM EMPLEWHERE DEPT_NO= DNO AND SALARIO IS NOT NULL) LOOP SALARIO_TOTAL := SALARIO_TOTAL + SAL_EMP.SALARIO; END LOOP; RETURN(SALARIO_TOTAL); END SALARIO_TOTAL_DPTO; /

Ya tenemos la funcin creada y almacenada en la base de datos. Para ejecutarla la tenemos que llamar desde otro subprograma o bloque annimo: DECLARE TOTAL NUMBER(6); BEGIN TOTAL:=SALARIO_TOTAL_DPTO(30); DBMS_OUTPUT.PUT_LINE('La suma de salarios es: '||TOTAL); END; Ejercicio4.Crea un procedimiento que utilizando la funcin anterior modifique el salario de todos los empleados de un determinado departamento estableciendo como nuevo valor la media de los salarios de dicho departamento. No utilizar la funcin PROMEDIO.

Pg. 14 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL J).- PARMETROS: Los subprogramas utilizan parmetros para pasar y recibir informacin. Hay 2 clases: Parmetros actuales o reales: Son las variables indicadas en la llamada a un subprograma. Parmetros formales: Son variables declaradas en la especificacin del subprograma. Los tipos de los parmetros actuales y los correspondientes parmetros formales deben ser compatibles. Podemos hacer el paso de parmetros utilizando la notacin posicional, nominal o mixta: Notacin posicional: El compilador asocia los parmetros actuales a los formales basndose en su posicin. Es la opcin por defecto. Notacin nominal: Parmetro actual => Parmetro formal. Notacin mixta: Usan ambas notaciones, la posicional debe preceder a la nominal. PL/SQL soporta 3 tipos de parmetros: IN Parmetros de Entrada. Se usan para pasar valores al subprograma. Dentro del subprograma actan como constantes, no se les puede asignar ningn valor. El parmetro actual puede ser una variable, constante, literal o expresin. Es el tipo de parmetros por defecto. Parmetros de Salida. Se usan para devolver valores al programa que hizo la llamada. Actan como variables no inicializadas y slo se pueden utilizar para asignarles un valor. El par. actual debe ser una variable.

OUT

IN OUT Parmetros de Entrada/Salida. Permiten pasar un valor inicial al subprograma y devolver un valor actualizado. Actan como variables inicializadas. El par. Actual debe ser una variable. El formato genrico de declaracin de parmetros es: nombre_variable [IN || OUT || IN OUT ] tipo [:= || DEFAULT valor] Los parmetros de entrada se pueden inicializar con valores por omisin, es decir, indicar al subprograma que en el caso de que no se pase el parmetro correspondiente asuma el valor especificado por defecto con DEFAULT o := Para borrar un subprograma: DROP PROCEDURE || FUNCTION nombre_subprograma;

Pg. 15 de 16

APUNTES TEMA 9: INTRODUCCIN PL/SQL EJERCICIO.PROCEDURE CREAR_DEPART(V_NUMDPTO DEPART.DEPT_NO%TYPE, V_DNOM DEPART.DNOMBRE%TYPE DEFAULT 'PROVISIONAL', V_LOCA DEPART.LOC%TYPE DEFAULT 'PROVISIONAL') IS BEGIN INSERT INTO DEPART VALUES(V_NUMDPTO, V_DNOM, V_LOCA); END CREAR_DEPART; Indica cules de las siguientes llamadas son correctas y cules incorrectas. En el caso de que sea incorrecta, escrbela correctamente usando la notacin posicional. CREAR_DEPART; CREAR_DEPART(50); CREAR_DEPART('COMPRAS'); CREAR_DEPART(50,'COMPRAS'); CREAR_DEPART('COMPRAS', 50); CREAR_DEPART('COMPRAS', 'VALENCIA'); CREAR_DEPART(50, 'COMPRAS', 'VALENCIA'); CREAR_DEPART('COMPRAS', 50, 'VALENCIA'); CREAR_DEPART( 'VALENCIA', 'COMPRAS'); CREAR_DEPART( 'VALENCIA', 50);

Pg. 16 de 16

Вам также может понравиться