Anda di halaman 1dari 26

INTRODUCCIN

Oracle incorpora un gestor PL/SQL en el servidor de la BD y en las principales herramientas (Forms, Reports, Graphics,) Este lenguaje est basado en el lenguaje ADA e incorpora todas las caractersticas de una lenguaje de tercera generacin: Variables Estructura modular (procedimientos y funciones) Estructuras de control (bifurcaciones, bucles y dems) Control de excepciones Etc.. Los programas creados con PL/SQL se pueden almacenar en la base de datos como cualquier otro objeto de sta, facilitando el acceso a todos los usuarios autorizados a ellos. Los programas se ejecutan en el servidor Es tambin imprescindible para construir disparadores o triggers de bases de datos (bloques PL/SQL asociados a una tabla que se ejecutan o disparan cuando se producen ciertos eventos sobre la tabla).
Tema 10_ Introduccin al PL-SQL 1

Caractersticas
PL/SQL es un lenguaje procedimental. Est incluido en el servidor y en algunas herramientas de cliente. Soporta todos los comandos de consulta y manipulacin de datos. Aporta al lenguaje SQL estructuras de control y otros elementos propios de los lenguajes de programacin de tercera generacin. Su unidad de trabajo es el bloque, constituido por un conjunto de declaraciones, instrucciones y mecanismos de gestin de errores y excepciones.
Tema 10_ Introduccin al PL-SQL 2

Bloques PL/SQL
Con PL/SQL se pueden construir distintos tipos de programas: procedimientos, funciones,.. La estructura bsica de este lenguaje es el bloque. Un bloque tiene 3 zonas:
Una zona de declaraciones:
donde se declaran objetos (variables, constantes, ..) Es opcional Suele ir precedida por la clusula DECLARE (o IS/AS en los procedimientos y funciones)

Un conjunto de instrucciones:
Precedido por la clusula BEGIN

Una zona de tratamientos de excepciones:


Precedido por la clusula EXCEPTION. Esta zona tambin es opcional.
Tema 10_ Introduccin al PL-SQL 3

Bloques PL/SQL
El formato genrico de un bloque: [DECLARE <declaraciones>] BEGIN <rdenes> [EXCEPTION <gestin de excepciones>] END; En este ejemplo se borra el departamento nmero 20, pero antes se crea un departamento provisional, donde se guardan los empleados del departamento 20. Tambin informa del nmero de empleados afectados. Ejemplo: DECLARE v_num_empleados NUMBER(2); BEGIN INSERT INTO DEPART VALUES (99,PROVISIONAL,NULL); UPDATE EMPLE SET DEPT_NO=99 WHERE DEPT_NO=20; v_num_empleados := SQL%ROWCOUNT; DELETE FROM depart WHERE DEPT_NO=20; DBMS_OUTPUT.PUT_LINE(v_num_empleados || Empleados ubicados en provisional); EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20000, Error en la aplicacin); END;

Tema 10_ Introduccin al PL-SQL

Definicin de datos compatibles con SQL


PL/SQL dispone de tipos de datos compatibles con los tipos utilizados para las columnas de las tablas: NUMBER, VARCHAR2, DATE.. Adems dispone de otros tipos propios como BOOLEAN. PL/SQL permite declarar una variable del mismo tipo que otra variable o que una columna de la tabla mediante el atributo %TYPE
Ej: NombreAct Empleados.Nombre%TYPE

Tambin se puede declarar una variable para guardar una fila completa de una tabla mediante el atributo %ROWTYPE
Ej: Mifila Empleados%ROWTYPE
Las declaraciones de los datos deben realizarse en la seccin de declaraciones: DECLARE .. BEGIN

Tema 10_ Introduccin al PL-SQL

Estructuras de control
Las estructuras de control en PL/SQL son las habituales en los lenguajes de programacin estructurada:
Estructuras de control alternativas Alternativas simple Alternativa doble IF <condicion> THEN Instrucciones; . END IF; IF <condicion> THEN Instrucciones; ; ELSE Instrucciones; ..; END IF; Alternativa mltiple IF <CONDICION> THEN instrucciones; ELSIF <condicion2> THEN instrucciones; ..; ELSIF <condicion3> THEN instrucciones; ..; ELSE instrucciones; ..; END IF; 6

Tema 10_ Introduccin al PL-SQL

Estructuras de control
Estructuras de control repetitivas Mientras WHILE <condicion> LOOP instrucciones; . END LOOP; Para Iterar FOR <variable> LOOP IN <mnimo>, instrucciones; <mximo> LOOP ; instrucciones; EXIT WHEN ; <condicin>; END LOOP; ; instrucciones; ; END LOOP;

Desde PL/SQL se puede ejecutar cualquier orden de manipulacin de datos: DELETE, UPDATE, INSERT. Ejemplos: DELETE FROM clientes WHERE nif=Vnif; UPDATE PRODUCTOS SET STOCK:= STOCKUnidadesVendidas WHERE CodProducto=Vcodigo; INSERT INTO clientes VALUES (V_num,V_nom, V_loc,)
Tema 10_ Introduccin al PL-SQL 7

Uso de cursores
PL/SQL el resultado de una consulta no va directamente al terminal del usuario, sino que se guarda en un rea de memoria a la que se accede mediante una estructura denominada cursor. Los cursores sirven para guardar el resultado de una consulta. A este tipo de cursores se les denomina cursores implcitos, puesto que no hay que declararlos. Es el ms sencillo, pero tiene ciertas limitaciones: la consulta deber devolver una nica fila, en caso contrario se producir un error. Ejemplo: SELECT COUNT(*) INTO v_numventas FROM VENTAS;
Tema 10_ Introduccin al PL-SQL 8

En

Uso de cursores
Formato Bsico: SELECT <columna/s> INTO <variable/s> FROM <TABLA> [WHERE ]; Las variables que siguen al INTO reciben el valor de la consulta. Por tanto debe haber coincidencia de tipo con las columnas especificadas en la clusula SELECT. Ejemplo: DECLARE v_ape VARCHAR2(10); v_oficio VARCHAR2(10); BEGIN SELECT apellido, oficio INTO v_ape, v_oficio FROM EMPLE WHERE EMP_NO=799; END;

Tema 10_ Introduccin al PL-SQL

Gestin de excepciones
Las excepciones sirven para tratar errores y mensajes de las diversas herramientas. Oracle tiene determinadas excepciones correspondientes a algunos de los errores ms frecuentes que se producen al trabajar con la BD. Ej: NO_DATA_FOUND, TOO_MANY_ROWS Estas excepciones se disparan automticamente al producirse los errores asociados. Cuando en un bloque PL/SQL tenemos tratamientos de excepciones, si se detecta una, el PL/SQL pasa el control a la clusula WHEN correspondiente de la seccin EXCEPTION, que lo tratar segn lo establecido. Al finalizar este tratamiento, se devuelve el control al programa que llam al bloque que trat la excepcin.

Tema 10_ Introduccin al PL-SQL

10

Gestin de excepciones
Ejemplo: DECLARE v_ape VARCHAR2(10); v_oficio VARCHAR2(10); BEGIN SELECT apellido, oficio INTO v_ape, v_oficio FROM emple WHERE EMP_NO=7900; DBMS_OUTPUT.PUT_LINE (v_ape || * ||v_oficio); EXCEPTION WHEN NO_DATA_FOUND THEN Insert into temp (col1) values (ERROR no hay datos); WHEN TOO_MANY_ROWS THEN Insert into temp (col1) values (ERROR demasiados datos); WHEN OTHERS THEN RAISE_APPLICATION_ERROR (-20000, ERROR en la aplicacin); END;

Tema 10_ Introduccin al PL-SQL

11

Estructura modular
Se pueden distinguir los siguientes tipos de programas:
Bloques annimos:
No tienen nombre La zona de declaraciones comienza con la palabra DECLARE. Su utilizacin real es escasa.

Subprogramas:
Son bloques PL/SQL que tienen un nombre. La zona de declaraciones comienza con la palabra IS. Pueden ser de dos tipos:
PROCEDIMIENTOS: es el tipo de programas ms usado en PL/SQL. Normalmente se almacenan en la BD. FUNCIONES: formato similar al de los procedimientos, pero stos devuelven un valor.

Tema 10_ Introduccin al PL-SQL

12

Estructura modular
Procedimientos: PROCEDURE <nombreprocedimiento> [(<lista de parmetros>)] IS [<declaraciones objetos locales>;] BEGIN <instrucciones>; [EXCEPCTION <excepciones>;] END [<nombreprocedimiento>];

Tema 10_ Introduccin al PL-SQL

13

Estructura modular
Procedimientos:
Se pueden distinguir dos partes en el procedimiento:
Cabecera:
Es donde va el nombre del procedimiento Y los parmetros.

Cuerpo del procedimiento


Es un bloque PL/SQL.

Funciones:
Su formato genrico es similar al de los procedimientos, pero stas pueden devolver un valor.

Tema 10_ Introduccin al PL-SQL

14

Interaccin con el usuario


PL/SQL no es un lenguaje creado para interactuar con el usuario, sino para trabajar con la BD. No dispone de rdenes o sentencias que capturen datos introducidos por teclado, ni tampoco para visualizar datos en la pantalla. Se dispone del paquete DBMS_OUTPUT con fines de depuracin. Este incluye entre otros el paquete PUT_LINE que permite visualizar textos en la pantalla. Se utilizar el procedimiento PUT_LINE para poder probar los programas y visualizar los resultados. El formato genrico para invocar a este procedimiento es: DBMS_OUTPUT.PUT_LINE(<expresin>) La variable de entorno SERVEROUTPUT deber estar en ON. Para pasar datos a un programa podemos:

Introducir datos en una tabla desde SQL*Plus y despus leerlos desde el programa. Utilizar variables de sustitucin en bloques annimos. Pasar los datos como parmetros en la llamada (en procedimientos y funciones)

Tema 10_ Introduccin al PL-SQL

15

Se pueden diferenciar tres tipos de bloques PL/SQL que trabajan con el motor del servidor:
Bloques PL/SQL annimos:
Se pueden generar con diversas herramientas, como SQL*Plus y se envan al servidor Oracle, donde sern compilados y ejecutados. Se trata de procedimientos y funciones que se compilan y almacenan en la base de datos, donde quedarn disponibles para ser ejecutados. Por razones de funcionalidad, estos procedimientos y funciones tambin se pueden agrupar en paquetes, los cuales tambin se almacenan en la base de datos. Son subprogramas almacenados que se asocian a una tabla de la base de datos. Estos subprogramas se ejecutan nicamente al producirse determinados cambios en la tabla.

PL/SQL del servidor Oracle

Subprogramas almacenados:

Disparadores de base de datos:

Algunas herramientas de Oracle (Forms, Reports, ..) contienen un motor PL/SQL capaz de procesar bloques PL/SQL ejecutando las rdenes procedimentales en el cliente o en el lugar donde se encuentre la herramienta, y enviando solamente las instrucciones de SQL al servidor Oracle.

Tema 10_ Introduccin al PL-SQL

16

Usos y Ejemplos
Uso de Bloques annimos:
Son bloques PL/SQL que no tienen nombre Se suelen ejecutar desde SQL*Plus. Oracle reconoce el comienzo de un bloque annimo cuando encuentra la palabra reservada DECLARE o BEGIN. Cuando ocurre esto, limpia el buffer SQl, ignora los ; y entre en modo INPUT. La ltima lnea del bloque ha de ser un punto(.) Esto provoca que se guarde todo el bloque en el buffer SQL. Una vez guardado se puede ejecutar mediante la orden RUN. Tambin se puede utilizar el signo / , en lugar del punto. En este caso adems de almacenarse en el buffer, se ejecutar. Algunas rdenes:
Guardar el buffer en un fichero:SAVE Para cargar un bloque de un fichero en el buffer: GET Una vez cargado, para ejecutarlo : RUN Tambin se puede cargar y ejecutar con la orden START.

Tema 10_ Introduccin al PL-SQL

17

Usos y Ejemplos
Ejemplos (Bloques annimos):
1. El siguiente bloque no hace nada SQL> SET SERVEROUTPUT ON SQL> BEGIN NULL; END;
/

Procedimiento PL/SQL terminado con xito.

2. El siguiente bloque escribe HOLA MUNDO. SQL> BEGIN DBMS_OUTPUT.PUT_LINE (HOLA MUNDO); END; / HOLA MUNDO Procedimiento PL/SQL terminado con xito
Tema 10_ Introduccin al PL-SQL 18

Usos y Ejemplos
Ejemplos (Bloques annimos):
3. Este bloque muestra el precio del producto especificado: SQL> DECLARE V_precio NUMBER; BEGIN SELECT precio_uni INTO v_precio FROM productos WHERE COD_PRODUCTO=7; DBMS_OUTPUT.PUT_LINE (v_precio); END; / 20000 Procedimiento PL/SQL terminado con xito.

Tema 10_ Introduccin al PL-SQL

19

Usos y Ejemplos
Ejemplos (Bloques annimos):
4. En los bloques PL/SQL se pueden utilizar variables de sustitucin SQL*Plus anteponiendo el signo & a la variable. Antes de ejecutar el bloque se solicitar valor para la variable. Las variables de sustitucin solamente son operativas para los bloques annimos no en los procedimientos. SQL> DECLARE v_nom CLIENTES.NOMBRE%TYPE; BEGIN SELECT nombre INTO v_nom FROM CLIENTES WHERE NIF= &vs_nif; DBMS_OUTPUT.PUT_LINE (v_nom); END; / Introduzca un valor para vs_nif: 333C Antiguo 6: WHERE NIF=vs_nif; Nuevo 6: WHERE NIF=333C; TERESA Procedimiento PL/SQL terminado con xito.
Tema 10_ Introduccin al PL-SQL 20

Usos y Ejemplos
Uso de procedimientos:
SQL> CREATE OR REPLACE 2 PROCEDURE ver_cliente (nomcli VARCHAR2) 3 AS 4 Nifcli VARCHAR2(10); 5 Domicli VARCHAR2(15); 6 BEGIN 7 SELECT NIF,DOMICILIO INTO nifclo,domicli 8 FROM CLIENTES 9 WHERE NOMBRE=nomcli; 10 DBMS_OUTPUT.PUT_LINE (Nombre: || nomcli || Nif: || nifcli || Domicilio: || domicli); 12 EXCEPTION 13 WHEN NO_DATA_FOUND THEN 14 DBMS_OUTPUT.PUT_LINE (No encontrado el cliente || nomcli); 15 END ver_cliente; 16 / Procedimiento creado.
Tema 10_ Introduccin al PL-SQL 21

Usos y Ejemplos
Uso de procedimientos:
Explicacin del ejemplo anterior: 1: indicamos que queremos crear o reemplazar un objeto. 2: El objeto es un procedimiento (PROCEDURE) y su nombre es ver_cliente. Este procedimiento recibir como parmetro de entrada nomcli, de tipo VARCHAR2. 3: La palabra reservada AS indica el comienzo de la zona de declaraciones donde se indicarn los objetos que intervendrn en el subprograma: variables, constantes, 4,5: Declaramos las variables nifcli y domicli, de tipo VARCHAR2 y del mismo tamao que las columnas correspondientes de la tabla CLIENTES. 6: la palabra reservada BEGIN indica el comienzo de la zona de instrucciones. 7,8,9: es una clusula SELECT con algunas particularidades: - El resultado del SELECT se depositar en las variables que siguen al INTO, en este caso:nifcli y domicli. La asignacin se realiza siguiendo un criterio posicional.
Tema 10_ Introduccin al PL-SQL 22

Usos y Ejemplos
Uso de procedimientos:
-La condicin indicada en el WHERE contiene el parmetro con el que se llama al procedimiento. 10: El procedimiento DBMS_OUTPUT.PUT_LINE, visualiza en pantalla el contenido de las variables y los literales. Las dos barras || sirven para concatenar cadenas de caracteres. Para que este procedimiento funcione correctamente la variable SERVEROUTPUT debe estar a ON antes de ejecutar el subprograma. 11: Es continuacin de la instruccin comenzada en la lnea anterior. La finalizacin de una orden finaliza con el ; 12: la palabra reservada EXCEPTION indica el comienzo de la zona de tratamiento de excepciones. Esta zona no se ejecutar a menos que suceda una excepcin. 13: caza la excepcin NO_DATA_FOUND, en el caso de que se produzca y ejecuta las intrucciones que siguen a la clusula THEN. 14: Visualiza el mensaje de error No encontrado el cliente x 15: Es el fin del procedimiento. Forma parte de la sintaxis PL/SQL. 16: Indica a SQL*Plus el final del bloque PL/SQL. Es una abreviatura del comando RUN: compila y guarda en la BD el programa introducido.
Tema 10_ Introduccin al PL-SQL 23

Usos y Ejemplos
Uso de procedimientos:
- Si todo sale bien, la respuesta de Oracle ser:

PROCEDIMIENTO CREADO. Si el compilador detecta errores, en lugar de este mensaje, aparecer: AVISO: PROCEDIMIENTO CREADO CON ERRORES DE COMPILACIN. La orden SHOW ERRORS permite ver los errores detectados y a posteriori desde el editor corregirlos. Cuando el procedimiento se ha creado correctamente, se almacena en el servidor de la BD y puede ser invocado desde cualquier estacin por cualquier usuario autorizado y con cualquier herramienta. Podemos invocar un procedimiento almacenado:
Mediante la orden EXECUTE, desde SQL*Plus:
- SQL> EXECUTE ver_cliente(antonio);

Desde un bloque PL/SQL


- SQL> BEGIN ver_cliente(antonio); END; /

En realidad, la orden EXECUTE es una utilidad de SQL*Plus que crea un bloque PL/SQL annimo y le aade un BEGIN y un END, al principio y final de la llamada al procedimiento.

Se pueden insertar comentarios en cualquier parte del programa.


De lnea con todo lo que sigue en esa lnea ser considerado comentario. De varias lneas con /* comentarios */

Tema 10_ Introduccin al PL-SQL

24

Usos y Ejemplos
Ejemplos de procedimientos:
1. Visualizamos el precio de un producto cuyo cdigo se pasa como parmetro: SQL> CREATE O REPLACE PROCEDURE ver_precio (v_cod_producto NUMBER) AS v_precio NUMBER; BEGIN SELECT PRECIO_UNI INTO v_precio FROM PRODUCTOS WHERE COD_PRODUCTO=v_cod_producto; DBMS_OUTPUT.PUT_LINE (v_precio); END; / Procedimiento creado SQL> EXECUTE ver_precio(7); 20000 Procedimiento PL/SQL terminado con xito.
Tema 10_ Introduccin al PL-SQL 25

Usos y Ejemplos
Ejemplos de procedimientos:
2. Procedimiento que nos permitir modificar el precio de un producto pasndole el cdigo del producto y el nuevo precio. El procedimiento comprobar que la variacin de precio no supere el 20%. SQL> CREATE O REPLACE PROCEDURE modificar_precio_procucto (codigoprod NUMBER, nuevoprecio NUMBER) AS precioant NUMBER (5); BEGIN SELECT PRECIO_UNI INTO precioant FROM PRODUCTOS WHERE COD_PRODUCTO=codigoprod; 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 al 20%); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(No encontrado el producto || codigoprod); END modificar_precio_producto; / Procedimiento creado SQL> EXECUTE modificar_precio_producto (3,8000); Procedimiento PL/SQL terminado con xito.
Tema 10_ Introduccin al PL-SQL 26

Anda mungkin juga menyukai