+ All Categories
Home > Documents > Taller de BD Contenido

Taller de BD Contenido

Date post: 14-May-2023
Category:
Upload: independent
View: 0 times
Download: 0 times
Share this document with a friend
103
Taller de BD
Transcript

Taller de BD

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

Ejemplo

Sección Declarativa

Sección de Ejecución

Sección de Manejo de Excepciones

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

Ejemplo de Bloques Anidados

Bloque 1Bloque 2

Ejemplo de Bloques Anidados

Bloque 1Bloque 2

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 “”

Ejemplo de Declaraciones

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 declaraciones implícitas

Ejemplo de usos

Ejemplo de usos

Ejemplo de usos

•Dada la tabla «auto», con la estructura que se muestra a continuación, se asignarán valores a la variable

Ejemplo de usos

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

Ejemplo de asignación mediante Select .. Into

Ejemplo de asignación mediante Select .. Into

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

Ejemplo de Alcance de Variables (Uso Correcto)

Ejemplo de Alcance de Variables (Uso Incorrecto)

Descripción del error existente

Petición de valores por pantalla

• <variable>:= &texto_a_mostrar

Delimitadores

Tipos de datos- Numérico

Tipos de datos- Texto

Tipos de datos- Fecha y Hora

Tipos de datos-

• RAW

• ROWID

• UROWID

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.

Tipos de datos-Compuestos

RECORD

TABLE

VARRAY

Tipo Punteros

REF CURSOR

REF tipo objeto

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“

Práctica

• Cargar fichero .sql desde Archivos de Taller de BD en Mi portal

Estructura de Control IF

• Sintaxis:IF <condición> THEN

-- Código

ELSIF <condición> THEN

-- Código

ELSE

-- Código

END IF;

Ejemplo uso de estructura 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….)

Ejemplo uso de estructura 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

Ejemplo uso de estructura GOTO

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

Ejemplo de consideraciones a la estructura de control GOTO

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;

Ejemplo uso sentencia LOOP

Sentencia WHILE

• Sintaxis:

WHILE <condicion> LOOP-- CódigoEND LOOP;

El ciclo se repite mientras <condición> sea verdadera

Ejemplo uso sentencia WHILE

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

Ejemplo cursor implícito

Ejemplo error cursor implícito

El cursor devuelve

más de una fila (TOO

MANY ROWS)

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

Ejemplo Cursor Explícito

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)

Ejemplo de otras formas de cursores explícitos

Ejemplo de otras formas de cursores explícitos

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»

Ejemplo Cursor de Actualización

Cursores con parámetros

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

Ejemplo de 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

Ejemplo Excepción predefinida por usuario

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

Ejemplo excepción personalizada

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

Ejemplo Pragma Exception Init

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»;

Ejemplo de procedimiento almacenado

Procedimiento Declarado

Ejemplo de procedimiento almacenado con cursor explícito

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


Recommended