Bases de Datos Belen PLSQL
Bases de Datos Belen PLSQL
Bases de Datos Belen PLSQL
PL/SQL-1
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control 5. Cursores 6. Procedimientos y Funciones Almacenados 7. Paquetes 8. Tratamiento de los Errores y Excepciones 9. Disparadores Bases de Datos Activas Disparadores en ORACLE
2008 Beln Vela
PL/SQL-2
PL/SQL-3
PL/SQL-4
PL/SQL-5
PL/SQL-8
PL/SQL-9
PL/SQL-10
Ejemplos vlidos
X, V_ENAME, CodEmp, V1, V2_, ES_UNA_VARIABLE_#, V_$_Cod
caracteres)
PL/SQL-11
Palabras reservadas:
A la hora de declarar identificadores hemos de tener en cuenta las palabras reservadas, que son palabras que tienen un significado especial para PL/SQL y que no podemos utilizar como variables porque tendramos problemas de compilacin, estas palabras son tales como DECLARE, BEGIN, END
PL/SQL-12
DESCRIPCIN Operador de suma Operador de multiplicacin Operador de igualdad Operador mayor que Delimitador final de expresin Indicador de atributo Selector de componente Delimitador cadena caracteres Indicador variable asignacin Operador distinto de Operador menor o igual que Operador de asignacin Operador de concatenacin Comienzo de etiqueta Cierre de comentario multilnea Carcter de tabulacin
DESCRIPCIN Operador de resta Operador de divisin Operador menor que Delimitador inicial de expresin Terminador de orden Separador de elementos Delimitador de enlace a BD. Delimitador cadena entrecomillada Operador de exponenciacin Operador distinto de Operador mayor o igual que Operador de asociacin Comentario, una sola lnea Fin de etiqueta Espacio Retorno de carro
PL/SQL-13
Numrico
Representa un valor entero o real, puede asignarse a una variable de tipo NUMBER sin tener que efectuar conversin alguna. Los literales enteros consisten de una serie de dgitos, precedidos opcionalmente por un signo ( + o -). No se permite utilizar un punto decimal en un literal entero. 123 +7 -9 Un literal real consta de signo, opcional, y una serie de dgitos que contiene punto decimal. Tambin pueden escribirse utilizando notacin cientfica. -17.7 23.0 1.345E7 -7.12e+12
2008 Beln Vela
PL/SQL-14
Los literales de tipo DATE almacenan informacin del ao, mes y da ( hora, minutos y segundos en el caso de TIMESTAMP)
05-JUN-07 23-01-2007
PL/SQL-15
PL/SQL-16
En caso de que el valor no sea una cadena, se puede usar la funcin TO_CHAR para transformarlo. Es necesario activar la opcin SERVEROUTPUT mediante la siguiente instruccin en el SQL*Plus:
SET SERVEROUTPUT ON; SET SERVEROUTPUT ON SIZE tamao del buffer; /* Se puede incluir en el fichero glogin.sql*/
PL/SQL-17
PL/SQL-19
>Introduzca un valor para fecha: 11/12/2007 >La fecha introducida es: 11/12/07 >Procedimiento PL/SQL terminado correctamente. SQL>
2008 Beln Vela
PL/SQL-20
variable
SET SERVEROUTPUT ON ACCEPT producto NUMBER FORMAT 9999 PROMPT Introduce el precio: ACCEPT iva NUMBER FORMAT 99.99 PROMPT Introduce el IVA: DECLARE
v_producto NUMBER:= &producto; v_iva NUMBER:= &iva;
BEGIN END; /
PL/SQL-21
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos
3. Variables de PL/SQL 4. Estructuras de Control 5. Cursores 6. Procedimientos y Funciones Almacenados 7. Paquetes 8. Tratamiento de los Errores y Excepciones 9. Disparadores Bases de Datos Activas Disparadores en ORACLE
2008 Beln Vela
PL/SQL-22
Variables de PL/SQL
Se definen en la seccin DECLARE. Las variables deben tener un tipo asociado. Su formato es el siguiente: Nombre_variable tipo_variable [:= valor_inicial]; DECLARE V_Fecha_Ingreso DATE := SYSDATE;
Fecha actual del sistema
Es preferible inicializar una variable siempre que su valor se pueda determinar, no obstante, PL/SQL define el contenido de las variables no inicializadas, asignndolas el valor NULL (valor desconocido o no definido).
2008 Beln Vela
PL/SQL-23
Variables de PL/SQL
NUMRICO: Contienen un valor numrico entero o de punto flotante -Number: numrico -Dec, decimal: numrico decimal -Double precision: doble precisin -Integer, int: enteros -Real: reales -Smallint: entero corto -Binary_integer: enteros (se usa para almacenar valores que slo se van a usar en clculos y no se van a almacenar en la BD). -Natural: nmeros naturales -Positive: nmeros positivos CARCTER: contienen un conjunto de caracteres -Varchar -Varchar2 -Char -Character -Long ROWID: Se puede almacenar un identificador de columna que es una clave que identifica unvocamente a cada fila de la base de datos -Rowid RAW (Tipo Binario); Se emplean para almacenar datos binarios -Raw -Long Raw BOOLEAN: Slo pueden contener los valores TRUE, FALSE o NULL TIPOS COMPUESTOS: Consta de una serie de componentes (TYPE IS RECORD| IS TABLE OF ) -Record -Table
2008 Beln Vela
PL/SQL-24
Variables de PL/SQL
UTILIZACIN DE %TYPE
Hay ocasiones que las variables que usamos en PL/SQL se emplean para manipular datos almacenados en una tabla de la BD. En estos casos tendr que ser la variable del mismo tipo que las columnas de las tablas.
PL/SQL-25
Variables de PL/SQL
REGISTROS
La sintaxis general para definir un tipo de registro es:
TYPE tipo_registro IS RECORD ( Campo1 Tipo1 [NOT NULL] [:= expr1], Campo2 Tipo2 [NOT NULL] [:= expr2], Campo3 Tipo3 [NOT NULL] [:= expr3], .. Campo(n) Tipo(n) [NOT NULL] [:= expr(n)]); Nombre_registro tipo_registro; Para hacer referencia a los campos de un registro se utiliza la notacin punto (.). Nombre_registro.Campo1 Para poder asignar un registro a otro, ambos deben ser del mismo tipo.
2008 Beln Vela
PL/SQL-26
Variables de PL/SQL
REGISTROS
Ejemplo:
DECLARE TYPE tipoDireccion IS RECORD ( tipoVia VARCHAR2(10) NOT NULL :=CALLE, nombreVia VARCHAR2(50), ciudad VARCHAR2(25), cp VARCHAR2(5)); V_Direccion tipoDireccion; BEGIN
-- Inicializacin de campos de la variable V_Direccion.nombreVia:=ALCALA; V_Direccion.ciudad:=MADRID; V_Direccion.cp:=28901; DBMS_OUTPUT.PUT_LINE(V_Direccion.tipoVia|| || V_Direccion.nombreVia);
... END;
2008 Beln Vela
PL/SQL-27
Variables de PL/SQL
REGISTROS
Es tpico en el trabajo con BD el declarar registros con el mismo formato que las filas de las tablas. Si se conoce la estructura de las tablas se crea un registro con ese formato, si no se utiliza el operador %ROWTYPE, similar a %TYPE. El registro tendr los mismos campos y del mismo tipo que la tupla de la tabla correspondiente de la BD.
PL/SQL-28
Variables de PL/SQL
REGISTROS
Ejemplo:
DECLARE -V_Empleados Empleado%ROWTYPE; BEGIN -- Inicializacin de campos de la variable V_Empleados.codigo:=Emp01; V_Empleados.nombre:=Pablo Martnez; V_Empleados.ciudad:=MADRID; ... END;
PL/SQL-29
V_Registro es una variable de tipo T_Registro: TYPE T_Registro IS RECORD( Nombres Estudiantes.nombre%TYPE, Apellidos Estudiantes.apellido%TYPE, Carrera Estudiantes.carrera%TYPE);
PL/SQL-30
Variables de PL/SQL
TABLAS
Para poder declarar una tabla es necesario primero definir su tipo y luego una variable de dicho tipo. La sintaxis general para definir un tipo de tabla es: TYPE tipotabla IS TABLE OF tipo [NOT NULL]; Donde:
tipotabla.- es el nombre del nuevo tipo que est siendo definido tipo.- es un tipo predefinido o una referencia a un tipo mediante
%TYPE
Una vez declarados el tipo y la variable, podemos hacer referencia a un elemento determinado de la tabla PL/SQL mediante la sintaxis:
nombretabla (ndice)
Donde nombretabla es el nombre de una tabla, e ndice es la posicin del elemento dentro de la tabla. 2008 Beln Vela
PL/SQL-31
Variables de PL/SQL
TABLAS
Ejemplo:
DECLARE TYPE tipo_tabla IS TABLE OF INTEGER; V_tabla tipo_tabla := tipo_tabla (0,1,2,3,4,5,6,7,8,9); BEGIN
DBMS_OUTPUT.PUT_LINE(V_tabla(1)); DBMS_OUTPUT.PUT_LINE(V_tabla(5)); DBMS_OUTPUT.PUT_LINE(V_tabla(10));
END; /
0 4 9 Procedimiento PL/SQL terminado correctamente. 2008 Beln Vela
PL/SQL-32
Variables de PL/SQL
ATRIBUTOS DE LA TABLA
COUNT. Devuelve el nmero de elementos de la tabla V_Tabla.Count 10 DELETE(I). Borra fila de la tabla V_Tabla.Delete(2) borra elemento de la posicin 2 de la tabla V_Tabla (no se redistribuyen) DELETE(I,S). Borra filas de la tabla V_Tabla.Delete(2,4) borra de la posicin 2 a la 4 de la tabla V_Tabla EXISTS BOOLEAN. Devuelve TRUE si existe en la tabla el elemento especificado. V_Tabla.Exists(1) TRUE FIRST BINARY_INTEGER. Devuelve el ndice de la primera fila de la tabla. V_Tabla.First 1 LAST BINARY_INTEGER. Devuelve el ndice de la primera fila de la tabla. V_Tabla.Last 10 NEXT BINARY_INTEGER. Devuelve el ndice de la fila de la tabla que sigue a la fila especificada. V_Tabla.Next ndice siguiente PRIOR BINARY_INTEGER. Devuelve el ndice de la fila de la tabla que antecede a la fila especificada, V_Tabla.Prior ndice anterior
2008 Beln Vela
PL/SQL-33
Variables de PL/SQL
Consideraciones a tener en cuenta: - DELETE constituye una orden completa por s mismo; no se lo utiliza como parte de una expresin como sucede con los otros atributos. - EXISTS devolver TRUE si existe el elemento buscado en caso contrario devolver FALSE. Este atributo es til para evitar el error ORA-1403 que se produce cuando el elemento no existe. - Tanto FIRST como LAST devolvern el ndice, no el valor contenido en dichas filas. - Excepto usando el atributo DELETE no hay manera de borrar todas las filas de una tabla
2008 Beln Vela
PL/SQL-34
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL
4. Estructuras de Control 5. Cursores 6. Procedimientos y Funciones Almacenados 7. Paquetes 8. Tratamiento de los Errores y Excepciones 9. Disparadores Bases de Datos Activas Disparadores en ORACLE
2008 Beln Vela
PL/SQL-35
Estructuras de Control
1) Estructuras lgicas: IF THEN ELSE
A) IF-THEN B) IF-THEN-ELSE C) IF-THEN-ELSIF
4) GOTO y ETIQUETAS
A) Restricciones de GOTO B) Etiquetado
2008 Beln Vela
PL/SQL-36
Estructuras de Control
A) Estructuras lgicas: IF THEN ELSE
Su sintaxis es: IF <expresin_booleana> THEN
Secuencia_de_rdenes;]
END IF; Donde <expresiones_booleanas> es cualquier expresin que de cmo resultado un valor booleano. Las clusulas ELSIF y ELSE son opcionales y puede haber tantas clusulas ELSIF como se quiera.
2008 Beln Vela
PL/SQL-37
Estructuras de Control
1) Estructuras lgicas: IF THEN ELSE
A) IF THEN Si se evala la condicin y resulta verdadera, se ejecutan uno o ms lneas de cdigo de programa. En el caso de que la condicin resulte ser falsa, NO se realiza NINGUNA accin. IF fecha_nac<1-01-1970 THEN -- No termina con un ; salario:= salario *1.15; -- aumento de salario en un 15% END IF; Se pueden anidar varias instrucciones: IF fecha_nac<1-01-1970 THEN IF apellido =Martnez THEN -- IF ANIDADO salario:= salario *1.15; -- aumento de salario en un 15%
PL/SQL-38
Estructuras de Control
1) Estructuras lgicas: IF THEN ELSE
B) IF THEN ELSE Si se evala la condicin y resulta verdadera, se ejecutan uno o ms lneas de cdigo de programa. En el caso de que la condicin resulte ser falsa, se ejecutan las instrucciones que siguen a la instruccin ELSE. IF fecha_nac<1-01-1970 THEN -- No termina con un ;
PL/SQL-39
Estructuras de Control
1) Estructuras lgicas: IF THEN ELSE
C) IF THEN ELSIF Si se evala la condicin y resulta verdadera, se ejecutan uno o ms lneas de cdigo de programa. En el caso de que la condicin resulte ser falsa, se evala la condicin especificada en el ELSIF. IF apellido =Prez THEN salario:= salario *1.10; -- aumento de ELSIF apellido =Martnez THEN salario:= salario *1.15; -- aumento de ELSIF apellido=Alvarez THEN salario:= salario *1.20; -- aumento de ELSE salario:= salario* 1.05; -- aumento de END IF; -- Slo se necesita un nico END IF
PL/SQL-40
Estructuras de Control
Condiciones Nulas
Procedimiento que nos dice si el nmero 1 (Num1) es mayor que el nmero 2 (Num2) : DECLARE Num1 NUMBER :=3; Num2 NUMBER; -- Como no inicializamos la variable, su valor es NULL EsMayor VARCHAR2(15); BEGIN Es muy importante inicializar siempre las IF Num1 < Num2 THEN Variables!! EsMayor := Yes; ELSE EsMayor := No; END IF; END; Solucin???
PL/SQL-41
Estructuras de Control
2) Expresiones CASE
La instruccin CASE es una evolucin en el control lgico. Se diferencia de las estructuras IF-THEN-ELSE en que se puede utilizar una estructura simple para realizar selecciones lgicas en una lista de valores. Puede utilizarse tambin para establecer el valor de una variable.
Su sintaxis es: CASE [variable] WHEN expresin1 WHEN expresin2 WHEN expresin3 WHEN expresin4 ELSE valor5; END CASE;
No existe lmite para el nmero de expresiones que se pueden definir en una expresin CASE.
2008 Beln Vela
PL/SQL-42
Estructuras de Control
2) Expresiones CASE
EJEMPLO: DECLARE equipo varchar(100); ciudad varchar(50):= MADRID; BEGIN CASE ciudad WHEN MADRID THEN equipo:=RealMadrid; WHEN BARCELONA THEN equipo:=FCBarcelona; WHEN LACORUA THEN equipo:= Deportivo de La Corua; ELSE equipo:=SIN EQUIPO; END CASE; DBMS_OUTPUT.PUT_LINE(equipo); END; /
Expresin a evaluar se pasa al principio de la sentencia CASE: ciudad=VALOR
2008 Beln Vela
PL/SQL-43
Estructuras de Control
2) Expresiones CASE
Cada clusula WHEN puede tener su propia expresin a evaluar. En este caso, despus del CASE no aparece ninguna expresin. EJEMPLO: CASE WHEN precio<11 THEN descuento:=2; WHEN precio>10 and precio<25 THEN descuento:=5; WHEN precio>24 THEN descuento:=10; ELSE descuento:=15: END CASE;
PL/SQL-44
Estructuras de Control
3) Estructuras de BUCLE
A) Bucles simples Su sintaxis es: LOOP
<Secuencia_de_rdenes>;
END LOOP; Este bucle sera infinito, no tiene condicin de parada. Para salir de un bucle le pondremos la orden EXIT, que su sentencia es: EXIT [WHEN <Condicin>]; Esta orden sera equivalente a: IF <Condicin> THEN EXIT; END IF;
2008 Beln Vela
PL/SQL-45
Estructuras de Control
3) Estructuras de BUCLE
A) Bucles simples EJEMPLO: DECLARE V_Contador BINARY_INTEGER:=1; BEGIN LOOP
PL/SQL-46
Estructuras de Control
3) Estructuras de BUCLE
B) Bucles WHILE Su sintaxis es: WHILE <Condicin> LOOP
<Secuencia_de_rdenes>;
END LOOP; Antes de entrar en el bucle evala la condicin, si es verdadera, entrar. Si la condicin es falsa o nula el bucle se termina. Hay que tener en cuenta que si la condicin del bucle no toma el valor TRUE la primera vez que se le comprueba el bucle, no llegar nunca a ejecutarse. Pueden usarse las rdenes EXIT o EXIT WHEN dentro de un bucle WHILE para salir del bucle, sin llegar a terminar la condicin.
2008 Beln Vela
PL/SQL-47
Estructuras de Control
3) Estructuras de BUCLE
B) Bucles WHILE EJEMPLO: DECLARE V_Contador BINARY_INTEGER:=1; BEGIN WHILE Contador <11 LOOP
PL/SQL-48
Estructuras de Control
3) Estructuras de BUCLE
C) Bucles FOR En el caso en que sepamos el nmero de iteraciones en que se ejecutarn los bucles simples y WHILE utilizaremos los bucles FOR. Su sintaxis es: FOR <contador_bucle> IN [ REVERSE ] menor . . mayor LOOP
Secuencia_de_rdenes
END LOOP; donde <contador_bucle> es una variable que no hace falta que se declare ya que lo hace de forma implcita como BINARY_INTEGER. Los valores menormayor muestra el rango en que se ejecutar el bucle.
2008 Beln Vela
PL/SQL-49
PL/SQL-50
Estructuras de Control
4) GOTO y etiquetas
Su sintaxis es: GOTO <Etiqueta>; donde <Etiqueta> es una etiqueta definida en el bloque PL/SQL. Al evaluar una orden GOTO el control pasa inmediatamente a la orden identificada por la etiqueta, por ejemplo: BEGIN DBMS_OUTPUT.PUT_LINE(Esto es un ejemplo.); GOTO Etiqueta_1; DBMS_OUTPUT.PUT_LINE(No hace el GOTO.); <<Etiqueta_1>> DBMS_OUTPUT.PUT_LINE(Entra en el GOTO.); END;
PL/SQL-51
Estructuras de Control
4) GOTO y etiquetas
USO: P.e.: Para hacer ms legible el bloque de ejecucin con manejadores de excepciones complejos en bloques anidados. Restricciones de GOTO No se puede saltar al interior de un bloque anidado No se puede saltar al interior de un bucle No se puede saltar al interior de una orden IF Etiquetado A los bucles pueden ponrseles etiquetas de forma que las usemos en la sentencia EXIT. En el caso de que se le aada una etiqueta a un bucle habr que ponerla tambin al final del bucle.
PL/SQL-52
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control
5. Cursores 6. Procedimientos y Funciones Almacenados 7. Paquetes 8. Tratamiento de los Errores y Excepciones 9. Disparadores Bases de Datos Activas Disparadores en ORACLE
2008 Beln Vela
PL/SQL-53
PL/SQL-54
Nota:
El nombre del cursor es un identificador PL/SQL, y ha de ser declarado en la seccin declarativa del bloque antes de poder hacer referencia a l.
PL/SQL-55
PL/SQL-56
Cursores Ejemplo:
DECLARE CURSOR C_Libros IS SELECT Titulo, Fecha FROM T_LIBRO WHERE Autor =DATE; BEGIN OPEN C_Libros; T_LIBRO
Titulo
Introduccin a las BD SGBD Oracle 10g BD Relacionales
OPEN CURSOR
Fecha
1990 2002 2007 1995
Conjunto Activo
Titulo Fecha
1990 1995 Introduccin a las BD BD Relacionales
Autor
DATE DE MIGUEL URMAN DATE
PL/SQL-57
declaradas y separadas por comas. Registro_PL/SQL: Es un registro PL/SQL previamente declarado. En ambos casos, la variable o variables de la clusula INTO deben ser compatibles en cuanto a tipo con la lista de seleccin de la consulta. Despus de cada FETCH, se incrementa el puntero activo, para que apunte a la siguiente fila. De esta forma, cada FETCH devolver filas sucesivas del conjunto activo, hasta que se devuelve el conjunto completo.
2008 Beln Vela
Nombre_cursor: Identifica a un cursor abierto y ya declarado. Lista_variables: Es una lista de variables PL/SQL previamente
PL/SQL-58
PL/SQL-59
Cursores
Excepciones NO_DATA_FOUND y %NOTFOUND
La excepcin NO_DATA_FOUND se produce slo en las rdenes SELECT.. INTO.. , cuando la clusula WHERE de la consulta no se corresponde con ninguna fila. En el caso de los cursores explcitos, por el contrario, cuando la clusula WHERE no se corresponde con ninguna fila, lo que sucede es que el atributo %NOTFOUND toma el valor TRUE. Si la clusula WHERE de una orden UPDATE o DELETE no se corresponde con ninguna fila, el atributo SQL %NOTFOUND toma el valor TRUE, en lugar de producirse la excepcin NO_DATA_FOUND. Debido a esta circunstancia todos los bucles de extraccin usan %NOTFOUND o %FOUND para determinar la condicin de salida del bucle, en lugar de la excepcin NO_DATA_FOUND.
2008 Beln Vela
PL/SQL-60
PL/SQL-61
Cursores Ejemplo
CREATE TABLE Autor (Nombre_A VARCHAR(50) PRIMARY KEY, Fecha_Nac DATE); INSERT INTO AUTOR VALUES ('Mario Piattini', '01/01/1960'); INSERT INTO AUTOR VALUES ('Adoracin de Miguel', '01/01/1940');
SET SERVEROUTPUT ON; DECLARE V_Autor AUTOR.Nombre_A%TYPE; CURSOR C_Autores IS SELECT Nombre_A FROM AUTOR; BEGIN OPEN C_Autores; V_Autor y Nombre_A DBMS_OUTPUT.PUT_LINE(Lista de autores); tienen que tener el mismo tipo LOOP FETCH C_Autores INTO V_Autor; EXIT WHEN C_Autores%NOTFOUND; DBMS_OUTPUT.PUT_LINE(El nombre del autor es: ||V_Autor); END LOOP; CLOSE C_Autores; END; /
2008 Beln Vela
PL/SQL-62
Cursores Ejemplo
Resultado de la Ejecucin:
/ Lista de autores El nombre del autor es: Mario Piattini El nombre del autor es: Adoracin de Miguel Procedimiento PL/SQL terminado correctamente. SQL>
PL/SQL-63
--cursor C_Estudiantes_Inf;
END LOOP; --Ahora se cierra el cursor END;
No se ha declarado la variable V_Estudiantes, pero el propio compilador la declara al analizar el bucle FOR. Es una forma ms sencilla y clara para el uso de los cursores.
2008 Beln Vela
PL/SQL-64
PL/SQL-65
PL/SQL-66
V_Creditos Clases.num_creditos%TYPE;
-- Cursor que selecciona los estudiantes matriculados en 3 de Informtica
CURSOR c_EstudiantesRegistrados IS SELECT * FROM Estudiantes WHERE Id_Estudiante IN (SELECT Id_Estudiante FROM Estudiante_Registrado WHERE Departamento=INF AND Curso=3) FOR UPDATE OF Creditos_Actuales;
2008 Beln Vela
PL/SQL-67
SELECT num_creditos INTO V_Creditos FROM Clases WHERE Departamento=INF AND Curso=3;
-- Actualiza la fila que acaba de recuperar con el cursor
UPDATE Estudiantes Atributo que Set Creditos_Actuales=Creditos_Actuales+V_Creditos se modifica WHERE CURRENT OF C_EstudiantesRegistrados; END LOOP; COMMIT; END; 2008 Beln Vela PL/SQL-68 /
PL/SQL-69
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control 5. Cursores
6. 7. 8. 9. Procedimientos y Funciones Almacenados Paquetes Tratamiento de los Errores y Excepciones Disparadores Bases de Datos Activas Disparadores en ORACLE
PL/SQL-70
La sintaxis es:
CREATE [OR REPLACE] PROCEDURE nombre_procedimiento
Tras crear el procedimiento, ste se compila y luego se almacena en la BD de forma compilada. Este procedimiento luego puede ser invocado desde cualquier bloque PL/SQL. Para borrar un procedimiento: DROP PROCEDURE nombre_procedimiento;
2008 Beln Vela
PL/SQL-71
existing object
PL/SQL-72
PL/SQL-73
PL/SQL-74
Cuando se llame al procedimiento en el caso de que no se especifique el valor para el parmetro, ste coger el valor por defecto. Por comodidad es recomendable colocar los parmetros con valores por defecto al final de los argumentos para que a la hora de declarar la llamada del procedimiento y no se pasen valores no existan errores o confusiones.
PL/SQL-75
Al ejecutarse mostrara un error (ORA-06502: PL/SQL), ya que colocara el primer valor en el primer parmetro, cuando este es de tipo NUMBER y no VARCHAR2.
PL/SQL-76
Sin embargo, una llamada a un procedimiento es una orden PL/SQL en s misma, mientras que una llamada a funcin se realiza como parte de su expresin.
PL/SQL-77
[ ( argumento [ {IN | OUT | INOUT} ] tipo, argumento [ {IN | OUT | INOUT }] tipo )]
RETURN return_tipo { IS | AS }
Dentro del cuerpo de la funcin existir la sentencia RETURN que devolver el valor de la variable deseada, sta ser del mismo tipo que el asignado en la clusula : RETURN tipo IS . Su sintaxis es: RETURN variable; Puede haber varias instrucciones RETURN, pero slo se ejecutar la primera que se encuentre dentro de la lgica del programa. Para borrar una funcin: DROP FUNCTION nombre_funcin;
2008 Beln Vela
PL/SQL-78
PL/SQL-79
PL/SQL-80
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control 5. Cursores 6. Procedimientos y Funciones Almacenados
7. Paquetes 8. Tratamiento de los Errores y Excepciones 9. Disparadores Bases de Datos Activas Disparadores en ORACLE
2008 Beln Vela
PL/SQL-81
Paquetes
Un paquete es un conjunto de bloques de PL/SQL que se encuentran guardados en un mismo objeto. Un paquete es, en esencia, una seccin declarativa con nombre. Cualquier cosa que pueda incluirse en la seccin declarativa de un bloque, puede incluirse tambin en un paquete. Esto abarca procedimientos, funciones, cursores, tipos y variables. Una ventaja de incluir estos objetos en un paquete es la posibilidad de referenciarlos desde otros bloques PL/SQL, con lo que los paquetes permiten disponer de variables globales en PL/SQL. Cada paquete est formado por dos partes, la especificacin y el cuerpo.
PL/SQL-82
Paquetes
ESPECIFICACIN DE UN PAQUETE Tambin denominada cabecera, contiene informacin acerca del contenido del paquete. Sin embargo, no contiene el cdigo de los procedimientos o funciones. La sintaxis general para la creacin de una cabecera de paquete es: CREATE [OR REPLACE] PACKAGE nombre_paquete {IS | AS}
PL/SQL-83
Paquetes
ESPECIFICACIN DE UN PAQUETE Las reglas sintcticas para una cabecera de paquete son las mismas que para una seccin declarativa, excepto en lo que se refiere a la declaracin de procedimientos y funciones. Estas reglas son:
Los elementos del paquete pueden aparecer en cualquier orden. Sin embargo y al igual que sucede en una seccin declarativa, un objeto debe ser declarado antes de poderlo referenciar. Si un cursor contiene una variable como parte de la clusula WHERE, por ejemplo, la variable debe ser declarada antes que el cursor. No es necesario que estn presentes todos los tipos de elementos. Un paquete puede contener solo especificaciones de procedimientos y funciones, por ejemplo, sin declarar ninguna excepcin de ningn tipo. Las declaraciones de procedimientos y funciones deben ser declaraciones formales, a diferencia de la seccin declarativa de un bloque, que puede contener tanto declaraciones formales como el cdigo de los procedimientos y funciones. El cdigo que implementa los procedimientos y funciones del paquete se encuentra en el cuerpo de este.
PL/SQL-84
Paquetes
CUERPO DE UN PAQUETE Es un objeto del diccionario de datos distinto de la cabecera. El cuerpo no puede ser compilado a menos que se haya previamente compilado la cabecera correspondiente. El cuerpo contiene el cdigo para las declaraciones formales de subprogramas incluidas en la cabecera. El cuerpo del paquete es opcional. Si la cabecera del paquete no contiene ningn procedimiento o funcin (solo declaraciones de variables, cursores, tipos, etc. ), entonces no es necesario que el cuerpo est presente. Esta tcnica resulta til para declarar variables globales, dado que todos los objetos de un paquete son visibles fuera de l. Cualquier declaracin formal de la cabecera del paquete debe ser implementada en el cuerpo del paquete. La especificacin del procedimiento o funcin debe ser la misma en ambos sitios, incluyendo el nombre del subprograma, los nombres de sus parmetros y los modos de stos. 2008 Beln Vela
PL/SQL-85
Paquetes
CUERPO DE UN PAQUETE La sintaxis para la creacin de un cuerpo de paquete es: CREATE [OR REPLACE] PACKAGE BODY nombre_paquete {IS | AS}
Implementacin_procedimiento | Implementacin_funcin |
END [nombre_paquete];
PL/SQL-86
Paquetes
MBITO PARA LOS PAQUETES
Cualquier objeto declarado en la cabecera de un paquete est
dentro de mbito y es visible fuera del paquete, sin ms que cualificar el objeto con el nombre del paquete. La llamada al procedimiento es igual que si fuera un procedimiento independiente. La nica diferencia es que hay que incluir como prefijo el nombre del paquete. Los procedimientos empaquetados pueden tener parmetros predeterminados, y pueden ser llamados utilizando notacin posicional o nominal (indicando el valor para cada parmetro parametro1=>Variable1), al igual que los procedimientos almacenados independientes. Dentro del cuerpo del paquete se puede hacer referencia a los objetos definidos en la cabecera sin necesidad de utilizar el nombre del paquete.
2008 Beln Vela
PL/SQL-87
Paquetes
SOBRECARGA DE LOS SUBPROGRAMAS DE UN PAQUETE Dentro de un paquete pueden sobrecargarse los procedimientos y funciones, es decir, puede haber ms de un procedimiento o funcin con el mismo nombre, pero con distintos parmetros. Esta caracterstica es muy til, dado que permite aplicar la misma operacin a objetos de tipos diferentes.
PL/SQL-88
Paquetes
SOBRECARGA DE LOS SUBPROGRAMAS DE UN PAQUETE Ejemplo: Supongamos que queremos aadir un estudiante a una clase, bien especificando el nmero de identificacin del estudiante, bien especificando el nombre y apellidos :
CREATE OR REPLACE PACKAGE PaqueteCurso AS PROCEDURE EstudianteNuevo (P_ID_Estudiante IN Estudiantes.ID%TYPE, P_Departamento IN CLASES.DEPARTMENTO%TYPE, P_Curso IN CLASES.Curso%TYPE); PROCEDURE EstudianteNuevo (P_Nombre IN Estudiantes.Nombre%TYPE, P_Apellidos IN Estudiantes.Apellidos%TYPE, P_Departamento IN CLASES.DEPARTMENTO%TYPE, P_Curso IN CLASES.Curso%TYPE); END PaqueteCurso;
PL/SQL-89
Paquetes
CREATE OR REPLACE PACKAGE PaqueteCurso BODY AS PROCEDURE EstudianteNuevo (P_ID_Estudiante IN Estudiantes.ID%TYPE, P_Departamento IN Clases.Departamento%TYPE, P_Curso IN Clases.Curso%TYPE) IS BEGIN
INSERT INTO Estudiantes_Matriculados (Id_Estudiante, Departamento, Curso) VALUES ( P_ID_Estudiante, P_Departamento, P_Curso);
COMMIT; END;
PL/SQL-90
Paquetes
PROCEDURE EstudianteNuevo (P_Nombre IN Estudiantes.Nombre% TYPE, P_Apellidos IN Estudiantes.Apellidos%TYPE, P_Departamento IN Clases.Departamento%TYPE, P_Curso IN Clases.Curso%TYPE) IS DECLARE V_ID_Estudiante Estudiantes.ID%TYPE; BEGIN SELECT ID INTO V_ID_Estudiante FROM Estudiantes WHERE Nombre = P_Nombre AND Apellidos = P_Apellidos; INSERT INTO Estudiantes_Matriculados(Id_Estudiante, Departamento, Curso) VALUES ( V_ID_Estudiante, P_Departamento, P_Curso); COMMIT; END EstudianteNuevo; END PaqueteCurso;
PL/SQL-91
Paquetes
Con esto podremos aadir un estudiante a la clase de dos formas: Primera opcin: BEGIN PaqueteCurso.EstudianteNuevo (10000, ORA,150); END; Segunda opcin: BEGIN PaqueteCurso.EstudianteNuevo (JAVIER, LOPEZ ,ORA ,150); END; La sobrecarga puede ser muy til cuando se pueda hacer la misma operacin con argumentos de tipos diferentes. Sin embargo, la sobrecarga est sujeta a diversas restricciones.
No se puede sobrecargar dos subprogramas si sus parmetros slo difieren en el nombre o en el modo. No pueden sobrecargarse dos funciones basndose slo en su tipo de retorno. Finalmente, los parmetros de las funciones sobrecargadas deben diferir tambin en cuanto a familia de tipos, no pudiendo realizarse sobrecargas dentro de la misma familia. Por ejemplo, CHAR y VARCHAR2, que pertenecen a la misma familia de tipos.
PL/SQL-92
ndice
1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control 5. Cursores 6. Procedimientos y Funciones Almacenados 7. Paquetes
8. Tratamiento de los Errores y Excepciones 9. Disparadores Bases de Datos Activas Disparadores en ORACLE
2008 Beln Vela
PL/SQL-93
Los errores que se producen en la fase de compilacin son detectados por el motor PL/SQL y comunicados al usuario.
Cuando se produce un error, se genera una excepcin. Cuando esto sucede, el control pasa al gestor de excepciones, que es una seccin independiente del programa. Esto permite separar la gestin de errores del resto del programa, lo que hace que sea ms fcil entender la lgica de ste, y tambin asegura que todos los errores sern interceptados.
2008 Beln Vela
PL/SQL-94
PL/SQL-95
Conjunto de sentencias N
END; Cada excepcin tendr un WHEN THEN y un conjunto de sentencias que intentarn subsanar el error acaecido.
2008 Beln Vela
PL/SQL-96
PL/SQL-97
Conjunto de sentencias
WHEN OTHERS THEN En la parte WHEN OTHERS THEN contiene las sentencias que se ejecutarn al ocurrir un error que no tiene excepcin declarada. Debe ser siempre el ltimo gestor de un bloque. Para saber el error que provoc la excepcin dentro del gestor de excepciones OTHERS podemos usar las funciones SQLCODE y SQLERRM para obtener el cdigo del error y el mensaje asociado.
PL/SQL-98
PL/SQL-99
PL/SQL-100
PL/SQL-101
PL/SQL-102
Bibliografa
Bibliografa Bsica
Abbey, Corey y Abramson. ORACLE8i: Gua de Aprendizaje (versiones 7.x, 8 y 8i). McGraw-Hill. Urman S. ORACLE 8: Programacin PL/SQL. McGraw-Hill. Urman S., Hardman, R., y McLaughlin, M. ORACLE DATABASE 10g. PL/SQL Programming. Oracle Press, 2004.
Bibliografa Complementaria
Elmasri, R. y Navathe, S. B. Fundamentos de Sistemas de Bases de Datos. Tercera Edicin. Addison-Wesley Iberoamericana, 2000.
PL/SQL-103