Date post: | 14-May-2023 |
Category: |
Documents |
Upload: | independent |
View: | 0 times |
Download: | 0 times |
Contenido
• En forma general, los conceptos que se estudiarán en la asignatura son:• Pl/Sql
• Procedures• Functions• Packages• Triggers• Cursors• Exceptions• Transacciones, concurrencia
• Administración de BD• Seguridad• Gestión en general
EvaluacionesPrimera Solemne 20% 8 de septiembre
Segunda Solemne 20% 27 de octubre
Tercera Solemne 40% 1 de diciembre
Talleres, controles, participación: 20%
Recuperativa: 15 de diciembre
Bloques PL/SQLAprendizajes esperados
• Construye procedimientos almacenados, triggers de base de datos, cursores y funciones que ayuden o implementen directamente soluciones a la lógica de negocio recogida en la captura de requerimientos de un sistema
•Discernir cuando usar un procedimientos almacenados, trigger de base de datos, cursor y función para implementar una solución a la lógica de negocio recogida en la captura de requerimientos de un sistema
Conceptos Claves
•El lenguaje PL/SQL es el ofrecido por Oracle para programar en sus bases de datos
•Es una ampliación de SQL, con elementos típicos de los lenguajes de programación como los ciclos, control de flujos, uso de variables, etc.
•Con PL/SQL se puede programar también para otras herramientas Oracle:• Oracle Forms• Oracle Reports• Oracle Graphics• Oracle Application Server
Conceptos Claves
•El bloque es la unidad mínima de programación en PL/SQL•Variables y tipos•Manejo de errores y excepciones•Cursores•Bucles•Objetos
Partes de un Bloque
•Sección Declarativa: se declaran todas las variables, constantes o estructuras necesarias que utilizará el programa•Sección de Ejecución: se incorporan todos los códigos necesarios para la ejecución del programa•Sección de Manejo de Excepciones: se incorporan todos los códigos necesarios para controlar las excepciones planificadas o no que se produzcan en la ejecución del código
Generalidades
Forma de agregar comentarios al código
Cada sentencia debe terminar con punto y
coma (;)
Partes de un Bloque Anónimo
• Sección Declarativa: Esta sección se reconoce porque comienza con el comando DECLARE• Declaración de variables, constantes…
• Sección de Ejecución: Esta sección se reconoce porque comienza con el comando BEGIN• Toda instrucción SQL que aparezca en esta sección deberá llevar
incorporado el parámetro INTO SELECT columnas INTO variables FROM tabla WHERE criterios
• Solo se admiten DML, en caso de requerir otras (alter, update… debe indicarse dentro de la instrucción EXECUTE INMEDIATE)
• Sección de Manejo de Excepciones: Esta sección se reconoce porque comienza con el comando EXCEPTION
• Todo bloque termina donde aparece el comando END• La sección de ejecución es la única obligatoria, las demás son
opcionales según las necesidades que se tengan
Tipos de bloque
•Bloques Anónimos: Se construyen de forma dinámica y no se almacenan.
•Bloques nonimados: Idem, pero con un nombre.
•Subprogramas: Se almacenan. Procedimientos, paquetes, funciones. Siempre se ejecutan bajo demanda.
• Triggers o disparadores: No se ejecutan a petición, si no ante determinado sucedo para el que han sido programado contra una tabla de sistema.
Bloques Anidados
• Un bloque puede estar anidado dentro de otro bloque
Bloque 1
Bloque 2
Bloque 1
Bloque 2
Forma correcta Forma incorrecta
Variables y tipos
• Las variables y constantes se declaran en la sección declarativa del bloque
• La asignación de valores a las variables puede ser realizada en cualquiera de las partes del bloque
Sintaxis
•En general, la sintaxis para declarar un variable y/o constante es la siguiente:
<Nombre_variable> [constant] <tipo_dato> [notnull][:=valor];
•Donde:<Nombre_variable>: Obligatorio. Es el nombre que se dará a la variable o constante
[constant]: Opcional. Indica que lo declarado es una constante. Su valor no puede ser modificado en tiempo de ejecución
<tipo_dato>: Obligatorio. Indica el tipo de dato que tendrá la variable o constante
[not null]: Opcional. Indica que la variable o constante no puede tomar un valor nulo
[:=valor]: Opcional. Asigna un valor a la variable o constante
Algunas consideraciones
•Una variable o constante no inicializada, asumirá el valor null• Las variables o constantes «not null», no pueden
asumir el valor nulo, por lo cual deben ser inicializadas• La inicialización puede incluir cualquier expresión de
PL/SQL. Dicha expresión debe retornar el mismo tipo de dato de la variable o constante•Deben nombrarse con letras, números, $, _, #•Máximo de 30 caracteres•No distingue mayúsculas y minúsculas salvo que vaya
entre “”
Declaraciones Implícitas
•Se pueden declarar variables o constantes de forma que «asuman» el tipo de datos de otra variable o constantes u otra estructura de la base de datos•%Type: Se utiliza para que la variable declarada de tipo escalar, asuma el tipo de datos de otra variable o constante, tipo columna.•%Rowtype: Se utiliza para definir una variable de tipo fila, asume el conjunto de columnas en el orden y tipo de la tabla referida.
•Subtypes
Ejemplo de usos
•Dada la tabla «auto», con la estructura que se muestra a continuación, se asignarán valores a la variable
Asignando valores con sentencia Select
• Otra forma de asignar valores a las variables es utilizando la sentencia «Select…into»
• Su estructura es la siguiente:
Select lista_valores into lista_variables
From tablas_origen
• Donde:
• Lista_valores: Lista de campos , otras variables o valores que serán almacenados en la lista de campos. Se separa por comas (,) en caso de existir mas de un valor
• Lista_variables: Lista de variables que recibirán los valores extraídos. Se separa por comas (,) en caso de existir mas de una variable
• Tablas_origen: Tablas de donde proviene la información
Consideraciones respecto a la asignación mediante Select .. Into
• Para el select .. into se espera siempre que devuelva sólo un valor o una fila (según sea el caso de variable escalar o variable de tipo fila)• Si la sentencia no devuelve valor alguno o devuelve más de uno, la ejecución del código arrojará error• No Data Found: No encuentra datos• Too Many Rows: Muchas filas encontradas
Alcance de las variables
• Las variables tienen un alcance local, es decir, son visibles sólo dentro del bloque al cual pertenecen
•Para los bloques anidados, las variables declaradas en el bloque contenedor (bloque que contiene a otro bloque) son visibles para el bloque contenido
• Las variables declaradas en el bloque contenido (bloque que se declara dentro de otro bloque) son visibles sólo en forma local a su bloque. El bloque contenedor no tiene acceso a dicha variable
Tipos de datos- LOP
•Referencian ficheros de gran tamaños:•BFILE: ficheros binarios hasta 4gb•BLOB: Ficheros binarios hasta (4gb-1)*(Bloque de BD)•CLOB: igual, tipo texto•NLOB: subtipo de CLOB, para ficheros en juego de caracteres nacional definido.
Funciones de Transformación
•To_char (<valor>,<formato>): Transforma valor al tipo CHAR, según el formato opcional
•To_number (<valor>,<formato>): Transforma valor al tipo NUMBER, según el formato opcional
•To_date (<valor>,<formato>): Transforma valor al tipo DATE, según el formato opcional
Funciones de Texto
• length(<valor>): Retorna el tamaño en caracteres de valor•upper (<valor>): Transforma valor en mayúsculas• lower(<valor>): Transforma valor en minúsculas• trim(<valor>): Elimina los espacios en blanco a la
derecha e izquierda de valor• ltrim(<valor>): Elimina los espacios en blanco a la
izquierda de valor• rtrim(<valor>): Elimina los espacios en blanco a la
derecha de valor
Funciones de valores simples
• ABS(n)= Devuelve el valor absoluto de (n)
• CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n“
• FLOOT(n) = Devuelve el valor entero inmediatamente inferior o igual a "n“
• MOD (m, n)= Devuelve el resto resultante de dividir "m" entre "n“
• NVL (valor, expresión)= Sustituye un valor nulo por otro valor.
• POWER (m, exponente)= Calcula la potencia de un numero
• ROUND (numero [, m])= Redondea números con el numero de dígitos de precisión indicados
• TRUNC (numero, [m])= Trunca números para que tengan una cierta cantidad de dígitos de precisión.
Funciones de fechas
•SYSDATE= Devuelve la fecha y hora del sistema.
•ADD_MONTHS (fecha, n)= Devuelve la fecha "fecha" incrementada en "n" meses
•MONTHS_BETWEEN (fecha1, fecha2)= Devuelve la diferencia en meses entre las fechas "fecha1" y "fecha2“
Estructura de Control IF
• Sintaxis:IF <condición> THEN
-- Código
ELSIF <condición> THEN
-- Código
ELSE
-- Código
END IF;
Estructura de control CASE
• Sintaxis:CASE variable
WHEN valor 1 THEN – Código
WHEN valor 2 THEN – Código
WHEN valor 3 THEN – Código
ELSE -- Código
END CASE;
• La estructura de control CASE también puede usarse en una sentencia SELECT o asignar su resultado a una variable (Variable:= case….)
Estructura de Control GOTO
• La sentencia GOTO permite desviar el flujo de ejecución a la etiqueta indicada
• Las etiquetas en el código se señalan con los símbolos << y >>
• Sintaxis:
GOTO etiqueta
Consideraciones a la Estructura de Control GOTO
• No es muy recomendable el uso de esta sentencia, ya que el abuso en su uso hace mas difícil el seguimiento del código para su depuración (rompe lo señalado para un lenguaje estructurado)
• Existen restricciones en su uso para algunos casos particulares, como por ejemplo, junto a la sentencia IF
Sentencias para ciclos
• PL/SQL ofrece tres formas para realizar ciclos:
• LOOP: Repite los ciclos infinitamente hasta que encuentra la instrucción EXIT•WHILE: Repite los ciclos mientras la condición
que lo acompaña sea verdadera•FOR: Repite los ciclos tantas veces como lo
señalen sus variables de inicio y termino
Sentencia LOOP
•Sintaxis 1:LOOP-- CódigoIf <condición> then
EXIT;End if;END LOOP;
• Sintaxis 2:
LOOP
-- Código
EXIT WHEN <condición>;
END LOOP;
Sentencia WHILE
• Sintaxis:
WHILE <condicion> LOOP-- CódigoEND LOOP;
El ciclo se repite mientras <condición> sea verdadera
Sentencia FOR
• Sintaxis:
FOR contador IN [REVERSE] inicio..final LOOP-- CódigoEND LOOP;
Con la opción REVERSE el ciclo se ejecuta en forma inversa
Ejemplo uso sentencia FOR
La variable j asume la estructura fila de la tabla persona (recordar el concepto de %rowtype)
Conceptos Cursor
•Son utilizados para gestionar los resultados de una sentencia SELECT -> PLSQL SOPORTA CONSULTAS.
•En el fondo, un cursor permite gestionar un conjunto de registros, recorriendo dicho conjunto y con acceso a sus datos
•Específicamente:• Cursor Implícito: No es necesario declararlo. La operación
SELECT INTO es un ejemplo• Cursor Explícito: Se necesita declararlo en el código
Cursor Implícito
•Un cursor implícito es aquel que devuelve una única fila como dato. La sentencia SELECT – INTO es un ejemplo de cursor implícito
• El cursor implícito debe retornar siempre una fila o registro. Si esa condición no se cumple, se producirá un error (excepción)
• Las excepciones que se pueden producir son:• NO DATA FOUND: No se encontró fila o registro que satisfaga el
SELECT utilizado• TOO MANY ROWS: El SELECT devuelve más de una fila o registro
Cursor Explícito
•Un cursor explícito puede devolver cero o más filas.
•Generalmente, un cursor explícito pasa por las siguientes etapas:•Declaración (CURSOR)•Apertura (OPEN)•Extracción (FETCH)•Cierre (CLOSE)
Sintaxis
•Para declarar un cursor:•Simple:
• CURSOR <nombre_cursor> IS <instrucción select>
•Con parámetros:• CURSOR <nombre_cursor> (param1 tipo1, param2 tipo2,
……, param n tipo n) IS <instrucción select>
Sintaxis
• Para abrir un cursor:
•Simple:•OPEN nombre_cursor;
•Con parámetros:•OPEN nombre_cursor (valor1, valor2, …., valor n);
Sintaxis
•Para extraer datos de un cursor:•Con variables:• FETCH nombre_cursor INTO lista_variables;
•Con registro PL/SQL:• FETCH nombre_cursor INTO registro_PL/SQL;
•Para cerrar un cursor:• CLOSE nombre_cursor
Atributos Cursores
•Con los atributos de los cursores se permite reconocer el estado de un cursor•%NOTFOUND: Devuelve verdadero cuando el cursor
no retorna un registro•%FOUND: Devuelve verdadero cuando el cursor
retorna un registro•%ISOPEN: Devuelve verdadero mientras el cursor esté
abierto•%ROWCOUNT: Devuelve la cantidad de registros que
se ha recuperado hasta el momento
Consideraciones
•Cuando un cursor está cerrado, no puede retornar registros y en general, los atributos tampoco pueden ser utilizados (excepto %ISOPEN)
•No se puede cerrar un cursor que ya está cerrado
•Es conveniente consultar el resultado de una extracción mediante los atributos del cursor (%NOTFOUND, %FOUND)
•Al terminar de usar un cursor, es recomendable cerrarlo para liberar espacio de memoria y dejarlo disponible para el SGBD
Otras formas de cursores explícitos
• Se puede utilizar una estructura de ciclo FOR, para recorrer el resultado de un cursor
•De la forma anterior, se ejecutan implícitamente las instrucciones OPEN, FETCH y CLOSE
•Uno de los puntos en contra respecto a esta modalidad, es que el cursor no tiene nombre, y por lo tanto, su resultado no puede ser capturado por una aplicación externa a Oracle para el uso de sus datos (ej. .NET, Java)
Conceptos Cursores de actualización • Los cursores de actualización se utilizan para
actualizar los valores de los datos que son utilizados por el propio cursor•Se debe considerar que los registros actualizados son
bloqueados mientras dura la actualización•En la declaración del cursor se agrega FOR UPDATE•En la sentencia Update se agrega en la condición
CURRENT OF «nombre_cursor»
Excepciones• Las excepciones se generan cuando se producen condiciones
de errores• Cuando ocurre en la ejecución del código, el control de dicha
ejecución se traspasa a la sección de manejo de excepciones del bloque
• Toda excepción se propagará hasta que sea capturada• Si la excepción es capturada, la ejecución del código no volverá
al punto donde se produjo el error• En particular, las excepciones predefinidas son aquellas que
deben ser declaradas. Se «lanzan» con la sentencia RAISE
•Se declaran como cualquier otra variable•Se aplican las mismas reglas de alcance que para las
variables (son «visibles» dentro del bloque donde son declaradas . También son visibles para los bloques internos que son declarados dentro del bloque principal)• La sentencia RAISE lanza la excepción dentro del
ámbito de alcance de dicha excepción
SintaxisDeclare
…..Begin
…..EXCEPTION
WHEN nombre_exception THEN…..
WHEN nombre_exception THEN…..
End;
Ejemplo de Uso
•Si se detecta el manejador de excepción apropiado, se ejecutará el código asociado, de lo contrario se ejecutará el código asociado al manejador OTHERS (siempre debe ser el último declarado)
Ejemplo de excepciones predefinidas• A continuación una lista de las mas utilizadas:
• Zero_Divide: Cuando existe una división por cero
• Too_Many_Rows: Cuando se devuelve mas de una fila
• No_Data_Found: Cuando no se devuelven datos
• Value_Error: Error aritmético, conversión o truncamiento
• Rowtye_mismatch: Tipos incompatibles
• Cursor_already_open: El cursor se encuentra tiempo
Funciones predefinidas para excepciones
•Con las funciones SQLCode y SQLErrm es posible obtener el código de error que se ha producido y el mensaje asociado, respectivamente
•Cuando no se produce error, SQLCode devuelve el valor 0 (cero)
•Son útiles cuando se necesita aclarar cual es el error producido
Ejemplo de SQLCode y SQLErrm
•SQLCode y SQLErrm no pueden ser utilizados directamente.
•Su resultados deben ser pasados a variables
Otro uso a SQLErrm
•A la función SQLErrm se le pasa un número negativo y devuelve el mensaje de error asociado
Excepciones personalizadas
•Con Raise_Application_Error se pueden personalizar las excepciones, es decir, dar un mensaje asociado al error que sea propio y asociado al negocio que trata el código•Sintaxis:
• Raise_application_Error(num_error, mensaje)• Donde:
• Num_error: Número Asociado, con un valor entre -20001 y -20999• Mensaje: Mensaje que se asocia al error
Pragma Exception Init
• Para controlar una excepción, es necesario que ésta tenga un nombre (ej. Zero_Divide)
•No todas las excepciones tienen nombre, por lo que sólo nos queda controlarlos con OTHERS
• Pragma es una directiva que corre en tiempo de compilación
• Con Exception_Init se asocia un número de excepción con un nombre. Así puede ser controlado en la sección de manejo de excepciones del bloque
Procedimientos Almacenados
• Los procedimientos almacenados son utilizados para que realicen cierta operatoria pero que no devuelven resultados al que invocó dicho procedimiento
• Sintáxis:Create [or Replace] Procedure «nombre_proc» [(lista_parametros)] is
…..
End [«nombre_proc»];
Consideraciones
• Al ocupar «Or Replace», en el caso que el procedimiento almacenado ya se encuentre en la BD, éste se reemplazará. En caso contrario, arrojará un error en la compilación
• No es obligatorio agregar el nombre del procedimiento al finalizar su código
• Un procedimiento almacenado posee las mismas secciones que un bloque anónimo (declaraciones, ejecución y excepciones). La diferencia es que la declaración «Create…Is» reemplaza a «Declare»
• Para eliminar un procedimiento almacenado se usa:• Drop procedure «nombre_procedimiento»;
Ejecución de un procedimiento almacenado
• Para ejecutar el procedimiento almacenado por código, podemos usar un bloque anónimo
Parámetros para procedimientos almacenados
• Los procedimientos almacenados permiten el uso de parámetros
• Cada parámetro se separa por una coma (,)
• Sintaxis:
• «Nombre_param» |«tipo_param»| «tipo_dato» |«opciones»|
• Donde:• Nombre_param: Nombre dado al parámetro
• Tipo_param: Define el tipo de parámetro
• Tipo_dato: Tipo de dato dado al parámetro
• Opciones: Se puede utilizar para dar un valor por defecto al parámetro
Tipos de Parámetros
• Los parámetros pueden ser de entrada (IN), de salida (OUT), o ambos (IN OUT)
• Parámetros IN: Son aquellos de sólo lectura que se utilizan para ingresar valores al procedimiento. Por defecto, en el caso que no se especifique el tipo de parámetro, éste se asume como de entrada
• Parámetros OUT: Son aquellos de escritura en donde el procedimiento le asigna un valor para ser utilizado posteriormente por el bloque que lo haya invocado
• Parámetros IN OUT: Son aquellos que poseen todas las características de los dos tipos anteriores
Ejemplo de uso de parámetro de entrada
• Dado el siguiente procedimiento
• Se puede utilizar de la siguiente forma:
Ejemplo de uso de parámetro de salida
• Dado el siguiente procedimiento
• Se puede utilizar de la siguiente forma:
Asignación de valores a los Parámetros
• Para asignar valores a los parámetros estudiaremos dos notaciones:• Posicional: Los valores son asignados en el mismo orden en que los parámetros
se encuentran declarados
• Nominal: Los valores son asignados en cualquier orden explicitando al parámetro al cual se le está asignando
Ejemplo de asignación de valores a parámetros por notación posicional• Dado el siguiente procedimiento
• La asignación de valores es de la siguiente forma forma:
Ejemplo de asignación de valores a parámetros por notación nominal• Dado el siguiente procedimiento
• La asignación de valores es de la siguiente forma forma:
Parámetros formales y actuales
• En la declaración de procedimientos que tienen parámetros, a éstos se les conoce como parámetros formales o ficticios
• La invocación de los procedimientos, consta de dos partes, el nombre del procedimiento y la lista de parámetros, los que también se conocen como parámetros actuales