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

TEMA 16: INTRODUCCION AL LENGUAJE PL/SQL

1.Introduccin Hasta el momento hemos trabajado con bases de datos interactivos(el usuario introduce una sentencia y la base de datos devuelve un resultado) esta forma no es operativa ya que se supone que todo el mundo debe conocer SQL. Tambin hemos creado algunos scripts de instrucciones en SQL, no obstante estos scripts tienen sus limitaciones. Para superar estas limitaciones Oracle incluye un gestor llamado PL/SQL en el servidor de base de datos. Este lenguaje esta basado en ada e incorporada todas las caractersticas de un lenguaje de 3 generacin: a) Manejo de variables b) Modularidad c) Estructura modular, procedimientos y funciones d) Estructuras de control, bifurcaciones, bucles e) Control de excepciones Los programas creados con PL/SQL se pueden almacenar como objetos de la base de datos, de este modo se facilita a los usuarios autorizados el acceso a estos programas. El uso de los procedimientos es imprescindible para construir disparadores de base datos (triggers). PL/SQL ser necesario para administradores como para desarrolladores de aplicaciones. 2. Caractersticas del Lenguaje PL/SQL es un lenguaje procedimental diseado por Oracle para trabajar con las bases de datos, esta incluido en el servidor as como en algunas herramientas clientes. 2.1 Bloques PL/SQL Con PL/SQL se pueden construir distintos tipos de programas (procedimientos, funciones) todos ellos tienen en comn una estructura bsica caracterstica del lenguaje denominada bloque. Un bloque tiene 3 zonas claramente definidas: a) Zona de declaraciones, donde se declaran objetos, variables, etc... suele ir precedida por la clusula DECLARE. Cuando sean procedimientos o funciones irn precedidas de IS/AS b) Conjunto de instrucciones precedidas por la clusula BEGIN. c) Tratamiento de excepciones, precedido por la clusula EXCEPTION, esta zona al igual que el DECLARE es opcional. Sintaxis [DECLARE <lista_declaraciones>] 1

BEGIN <ordenes> [EXCEPTION <gestion_excepciones> END; Ejemplo: DECLARE PL_NOM CHAR(10); PL_APELL CHAR(10); BEGIN SELECT CLT_NOM,CLT_APELL INTO PL_NOM,PL_APELL FROM CLIENTES WHERE CLT_NUM=1; DBMS_OUTPUT.PUT_LINE (PL_NOM||PL_APELL); END; / Que dara: Input truncated to 1 characters Margarita BORRAS PL/SQL procedure successfully completed. En este ejemplo en la zona de declaraciones declaramos 2 variables, que tienen que tener el mismo tipo de datos En el cuerpo hacemos una orden SQL cuyos valores almacenamos en las variables La orden DBMS_OUTPUT.PUT_LINE (pl_nom || pl_apell) muestra en la salida el resultado que se ha almacenado en esas 2 variables. 2.2 Definicin de datos compatibles con SQL PL/SQL dispone de tipos de datos compatibles con los tipos usados para las columnas de las tablas (NUMBER, VARCHAR2, DATE.....) adems de los suyos propios como es el tipo BOLEAN. Las declaraciones de los datos deben realizarse en la seccin de declaraciones. Ejemplo:

DECLARE Importe NUMBER(8,2); Contador NUMBER(2) DEFAULT 0; Nombre CHAR(20) NOT NULL := MIGUEL; Nuevo VARCHAR2(15); BEGIN ......... ......... ........ END; PL/SQL permite declarar una variable del mismo tipo que otra variable o que una columna de una taba mediante el atributo %TYPE. Declaramos una variable nombre del mismo tipo que nombre de la tabla clientes, sin saber el tipo de variable que tiene nombre de la tabla clientes. DECLARE Nombre clientes.clt_nom%TYPE; Ejemplo: DECLARE PL_NOM CLIENTES.CLT_NOM%TYPE; PL_APELL CLIENTES.CLT_APELL%TYPE; BEGIN SELECT CLT_NOM,CLT_APELL INTO PL_NOM,PL_APELL FROM CLIENTES WHERE CLT_NUM=1; DBMS_OUTPUT.PUT_LINE (PL_NOM||PL_APELL); END; / Que dara: Margarita BORRAS PL/SQL procedure successfully completed. Tambin se puede declarar una variable para guardar una fila completa de una tabla, mediante el atributo %ROWTYPE

Ejemplo: Mifila clientes%ROWTYPE; 2.3 Estructura de control Las estructuras de control de PL/SQL son habituales de los lenguajes de programacin estructurados. Estructuras de control alternativas ( IF) Alternativa simple IF <condicion> THEN Intrucciones; END IF; Alternativa doble IF <condicion> THEN Intrucciones; ELSE Intrucciones; END IF; Estructuras repetitvas WHILE <condicin> LOOP FOR <variable> IN <instrucciones> <minimo>..<mximo> END LOOP; LOOP Instrucciones END LOOP; 2.4 Uso de cursores LOOP Instrucciones; EXIT WHEN <condicion> Instrucciones; END LOOP; Alternativa mltiple IF <condicion> THEN Intrucciones; ELSEIF<condicion2>THEN Instrucciones; ELSEIF ELSE END IF;

En PL/SQL el resultado de una consulta no va directamente al terminal del usuario, sino que se guarda en una rea de memoria a la que accede mediante una estructura llamada cursor. Ejemplo: SELECT COUNT(*) INTO variable FROM clientes; Contara el numero de filas que tiene la tabla clientes y la guardara en variable. En este ejemplo el cursor seria variable. 2.5 Gestin de excepciones Las excepciones sirven para tratar errores y mensajes de las distintas herramientas, Oracle tiene determinadas excepciones correspondientes a algunos de los errores ms frecuentes que se producen al trabajar con la base de datos, algunos son:

a) NO_DATA_FOUND, una orden del tipo SELECT INTO no devuelve valor. b) TOO_MANY_ROWS, una orden del tipo SELECT INTO ha devuelto mas de una fila. Condiciones para ejemplos: EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (No ha devuelto datos); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE (Ha devuelto demasiados datos); Ejemplo: DECLARE PL_NOM CLIENTES.CLT_NOM%TYPE; PL_APELL CLIENTES.CLT_APELL%TYPE; BEGIN SELECT CLT_NOM,CLT_APELL INTO PL_NOM,PL_APELL FROM CLIENTES WHERE CLT_NUM=0; DBMS_OUTPUT.PUT_LINE (PL_NOM||PL_APELL); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('No ha devuelto datos'); END; / Que mostrara: No ha devuelto datos PL/SQL procedure successfully completed. Ejemplo 2: DECLARE PL_NOM CLIENTES.CLT_NOM%TYPE; PL_APELL CLIENTES.CLT_APELL%TYPE; BEGIN

SELECT CLT_NOM,CLT_APELL INTO PL_NOM,PL_APELL FROM CLIENTES; DBMS_OUTPUT.PUT_LINE (PL_NOM||PL_APELL); EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE ('Ha devuelto demasiados datos'); END; / Que mostrara: Ha devuelto demasiados datos PL/SQL procedure successfully completed. 2.4 Estructura modular En una aproximacin modular podemos distinguir los distintos tipos de programas: a) Bloques annimos, no tiene nombre, la zona de declaracin comienza con la palabra clave DECLARE y su utilizacin es escasa. b) Subprogramas, son bloques PL/SQL que tienen un nombre, la zona de declaraciones comienza con la palabra reservada IS, a su vez puede ser de 2 tipos: 1) PROCEDIMIENTOS, es el tipo de programa mas usado en PL/SQL, normalmente se almacenan en la base de datos. Sintaxis: PROCEDURE nombre_procedimiento [(lista_parmetros)] IS [<declaraciones_locales>;] BEGIN <instrucciones>; [EXCEPTION <excepciones>;] END [<nombre_procedimiento>]; Se pueden distinguir 2 partes en el PROCEDIMIENTO, la cabecera en donde va el nombre del procedimiento, y el cuerpo que es donde se ponen las sentencias SQL.

2) FUNCIONES: su formato es muy parecidos de los PROCEDIMIENTOS con la diferencia de que devuelven un valor. 3. Interaccin con el usuario en PL/SQL PL/SQL no es un lenguaje para interactuar con el usuario, sino para trabajar con la base de datos, prueba de ello es que no disponen de funciones de capturacin de datos introducidos por teclado. No obstante dispone del paquete DBMS_OUTPUT.PUT.PUT_LINE, para que funcione correctamente este paquete, la variable entorno SERVEROUTPUT deber estar a ON, en caso contrario los programas no darn ningn error, pero no visualizara nada. 4. Arquitectura. Bloques annimos y Procedimientos PL/SQL no es un producto independiente, sino una tecnologa integrada en el servidor Oracle, se trata de un motor o gestor que es capaz de ejecutar subprogramas y bloques PL/SQL que trabajan en coordinacin con el ejecutor de ordenes SQL. 4.1. PL/SQL del servidor de Oracle Tipos de bloques que trabajan en el servidor: a) Bloques annimos b) Subprogramas (rutinas) o procedimientos almacenados: Procedimientos y Funciones c) Disparadores (triggers) Disparadores son subprogramas almacenados que se asocian a una tabla de la base de datos. Estos subprogramas se ejecutan automticamente al producirse determinados cambios en la tabla. Estos cambios sern insertado, borrar, actualizar. Ejemplo: como coger un dato de entrada de un cliente, buscamos por nombre al cliente Margarita y tenemos que poner en la condicin del WHERE clt_nom=&variable; DECLARE PL_APELL CLIENTES.CLT_APELL%TYPE; BEGIN SELECT CLT_APELL INTO PL_APELL FROM CLIENTES WHERE CLT_NOM='&VARIABLE'; DBMS_OUTPUT.PUT_LINE (PL_APELL); END; /

Que dara: Enter value for variable: Introducimos el nombre de Margarita y aparece lo siguiente: Enter value for variable: Margarita old 9: WHERE CLT_NOM='&VARIABLE'; new 9: WHERE CLT_NOM='Margarita'; BORRAS PL/SQL procedure successfully completed. 4.2.2. Procedimientos (no rallarse x el orden XD) Sintaxis y ejemplo: el procedimiento se llama VER_CLIENTE, le pasamos como parmetro su nombre y como resultado nos devolver su nombre, su apellido y su cdigo. Para ejecutar el programa seria EXEC nombre procedimiento y le damos el valor que recibe, ejemplo EXEC VER_CLIENTE (Margarita). El cdigo seria as: CREATE OR REPLACE PROCEDURE VER_CLIENTE(a CLIENTES.CLT_NOM %TYPE) IS PL_APELL CLIENTES.CLT_APELL%TYPE; PL_NOM CLIENTES.CLT_NOM%TYPE; PL_COD CLIENTES.CLT_NUM%TYPE; BEGIN SELECT CLT_NOM,CLT_APELL,CLT_NUM INTO PL_NOM,PL_APELL,PL_COD FROM CLIENTES WHERE CLT_NOM= a; DBMS_OUTPUT.PUT_LINE (PL_NOM||PL_APELL||PL_COD); END; / Lo compilamos: @pl4 Y despus ejecutamos el procedimiento:

EXEC VER_CLIENTE(Margarita) Que dara: Margarita BORRAS 1

PL/SQL procedure successfully completed. Observaciones: La creacin del procedimiento sea hace con CREATE PROCEDURE, REPLACE se usa para reemplazar un procedimiento que ya existiese con ese nombre. Entre parntesis le pasamos los parmetros de entrada del procedimiento con su tipo, a continuacin viene la clusula IS, despus de esto viene la declaracin de los cursores, al final pondremos END con el nombre del procedimiento que es opcional, seguido del slash /. Para ejecutarlo se usa: EXEC nombre_procedimiento (lista_parmetros) o BEGIN nombre_procedimiento (lista_parmetros);END; Para mostrar los errores escribimos SHOW ERRORS Para escribir comentarios escribimos guin - o /* 5. Ejercicios 1. Escribir un bloque PL/SQL que escriba el texto Hola. DBMS_SERVEROUTPUT.PUT_LINE (Hola); 2. Qu da este bloque? El numero de filas que contenga la tabla productos. DECLARE V_num NUMBER; BEGIN SELECT COUNT(*) INTO V_num FROM productos; DBMS_OUTPUT.PUT_LINE(V_num); END; / 3. CREATE OR REPLACE PROCEDURE modificar_precio_producto (codigoprod NUMBER, nuevo NUMBER) AS

Precioant BEGIN

NUMBER(5);

SELECT precio_uni INTO precioant FROM productos WHERE cod_producto = codprod; IF (precioant * 0.20) > ABS( precioant nuevoprecio) then UPDATE productos SET precio_uni = nuevoprecio WHERE cod_producto = codigoprod; ELSE DBMS_OUTPUT.PUT_LINE(Error, modificacin superior a 20%); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (No encontrado el producto || codigoprod); END modificar_precio_producto; / a) Cul es la cabecera del procedimiento? CREATE OR REPLACE PROCEDURE modificar_precio_producto (codigoprod NUMBER, nuevo NUMBER) AS Precioant b) Qu es el precioant? Una variable en el que se guarda el valor de preciouni c) Qu es el nuevoprecio? Una variable que guarda el preciouni si se cumple una condicin d) Qu es el precio_uni? Es una columna de la tabla productos NUMBER(5);

10

e) Cules son los parmetros del procedimiento? (codigoprod NUMBER, nuevo NUMBER) f) Qu es NO_DATA_FOUND? Que no ha recibido datos de esa consulta g) Cul es el nombre del procedimiento? modificar_precio_producto h) Dnde comienza el bloque? A partir del BEGIN i) Qu hace la clusula into? Guarda lo que hay en el campo de la tabla en el interior de la variable. j) qu hace la condicin del IF? Realiza una comparacin para ver si se cumple la condicin del IF k) Porque no tiene la clusula declare?Qu tiene en su lugar? Porque es un procedimiento. La clusula IS.

11

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