Departamento de Lenguajes y Sistemas Informáticos E.T.S. Ingeniería Informática. Universidad de Sevilla Avda Reina Mercedes sn. 41012 Sevilla TlfFax 954 557 139 E-mail lsi@lsi.us.es Web www.lsi.us.es Diseño de Bases de Datos e.t.s. ingeniería informática Diseño de bases de datos Anexo B Sevilla, febrero 2007 V 2007.02.1
Indice 1 INTRODUCCIÓN... 3 1.1 DISEÑO Y RENDIMIENTO.... 3 2 ESTRUCTURA DEL LENGUAJE.... 3 2.1 USO DE VARIABLES.... 4 2.1.1 Declaración de variables...4 2.1.2 Tipos de variables...4 2.1.3 La propiedad %TYPE...5 2.1.4 La propiedad %ROWTYPE....5 2.2 ESTRUCTURAS DE CONTROL.... 6 2.2.1 Control Condicional:...6 2.2.2 Control Iterativo:...6 EJERCICIO 1.... 7 EJERCICIO 2... 7 EJERCICIO 3... 8 EJERCICIO 4... 8 EJERCICIO 5... 8 EJERCICIO 6... 8 Pág. 2 de 8
1 Introducción. es un lenguaje procedural propietario de Oracle. Combina: la potencia de definición y manipulación de datos de SQL la potencia de procesamiento de los lenguajes procedurales. Tiene estructuras de bloques; las unidades básicas de un programa son bloques lógicos. [ * comienza parte de declaraciones *...Declaraciones de objetos] * comienza parte ejecutable *...Comandos y Sentencias SQL y [EXCEPTION * comienza parte de tratamiento excepciones *...Tratamiento de excepciones] Un bloque puede ser un bloque anónimo, un procedimiento o una función. La estrategia de diseño es la modularidad; reducir la complejidad del problema dividiendo el problema en problemas más simples y fáciles de implementar (definición de procedimientos y funciones almacenados) 1.1 Diseño y rendimiento. Diseñando las aplicaciones en base a una librería de subprogramas almacenados, podemos eliminar el Código Redundante e incrementar la Productividad. Así mismo, se reduce la probabilidad de que existan errores en el código aumentando la Integridad y Consistencia de las aplicaciones. Al crear un procedimiento, función ó package, Oracle automáticamente lo compila y el código objeto lo carga en una área de memoria compartida de la SGA. Así mismo, cuando se dispara un trigger y el código objeto no está en la SGA, Oracle lo compila y carga el código objeto en la SGA. Si varios usuarios invocan un procedimiento ó función que está cargado en la SGA ó disparan un trigger, no son necesarios accesos a disco ni hay que cargar el código objeto en un área de la SGA distinta para cada usuario. Por tanto, mejora en Funcionamiento y Concurrencia de las aplicaciones y los Requerimientos de Memoria son menores. 2 Estructura del lenguaje. Contiene las siguientes estructuras: Control condicional : (IF.. ). Control iterativo: (Bucles FOR, WHILE, LOOP) Anidamiento de bloques. Control robusto de errores. Excepciones Variables y constantes. Funciones Pág. 3 de 8
incorpora las sentencias DML (INSERT, UPDATE, DELETE) y las sentencias SELECT de SQL. permite obtener variables y constantes basadas en el tipo de dato actual de columnas de la base de datos, o referenciar estructuras completas de filas de una tabla. 2.1 Uso de variables. Las variables se declaran y se pueden inicializar en la sección declarativa de un bloque. Permiten pasar valores a un subprograma mediante parámetros. Existen tres formas: IN El valor viene del proceso de llamada (es un dato de entrada y su valor no se cambia). Es el valor por defecto. OUT En una salida de programa sin error, el valor del argumento es devuelto al proceso de llamada. IN OUT Es una variable de entradasalida. 2.1.1 Declaración de variables. La sintaxis para la declaración de variables es: Nombre_variable [CONSTANT] tipo_de_dato [NOT NULL] [ := DEFAULT expresión] CONSTANT Declara la variable como constante. Su valor no puede cambiar. Debe ser inicializada. Departamento VARCHAR2(10) NOT NULL := C1 ; Valor CONSTANT NUMBER(2) := 12; Fecha_nac DATE; Fecha_contrato DATE DEFAULT SYSDATE; 2.1.2 Tipos de variables. Los tipos de datos de las variables son: Escalar, Compuesto y LOB Existen otras variables que no son y podemos clasificar en: variables BIND y variables HOST. Variables tipo escalar. BINARY-INTEGER Almacena enteros con signo.subtipos:natural, POSITIVO NUMBER [(precisión, escala)]. Almacena números con punto fijo o flotante CHAR [(longitud máxima)]. Almacena cadenas de caracteres de longitud fija. VARCHAR2 (longitud máxima). Almacena cadenas de caracteres de longitud variable. LONG Almacena cadenas de caracteres de longitud variable. RAW. Almacena datos binarios. LONG RAW. Almacena datos binarios. BOOLEAN. Almacena TRUE, FALSE o NULL. DATE. Almacena valores de fecha. ROWID. Dirección física de una fila de la BD Tipo compuesto. Los tipos compuestos son las tablas y registros definidos por el usuario, tablas anidadas y varrays. Variables HOST. Son variables que se declaran por ej. en SQL*Plus y se utilizan en bloques. Para utilizarlas en tienen que llevar como prefijo dos puntos (:). Pág. 4 de 8
2.1.3 La propiedad %TYPE. Declara una variable basada en: El tipo de dato de otra variable declarada previamente. El tipo de dato de una columna de una tabla. Cuando se declara una variable para contener los valores de una columna de una tabla, es necesario asegurar que la variable es del mismo tipo y precisión que los datos que va a contener. De no ser así se producirá un error de ejecución. Para utilizar el atributo %TYPE en lugar de un tipo de dato en la declaración de la variable, se añade %TYPE al nombre de la columna o al nombre de la variable previamente declarada. Sintaxis: <nom_variable propietario.tabla.columna%type>; <nombre_variable variable_%type> ; Ejemplos: w_departamento dept.dept_no%type ; total NUMBER(6) := 1000 ; total_mensual total%type ; Reduce el mantenimiento de programas. 2.1.4 La propiedad %ROWTYPE. Declara una variable registro, que representa una fila en una tabla o vista. Las columnas de la fila, y los nombres de los campos de la variable registro, tienen los mismos nombres y tipos de datos. Sintaxis: <nombre_variable_registro propietario.tabla%rowtype> ; Ej.: EMP_REC EMP%ROWTYPE ;.. SELECT * INTO EMP_REC FROM EMP.. END ; Para hacer referencia a un campo: Ej.: EMP_REC.ename := José ; nombre_variable_registro.nombre_columna Es más útil utilizar %ROWTYPE que una variable tipo registro definido por el usuario ya que de está forma no es necesario conocer el número y tipo de datos de la tabla subyacente y evita hacer modificaciones cuando la estructura de la tabla cambie. Pág. 5 de 8
2.2 Estructuras de control. 2.2.1 Control Condicional: IF THEN ; IF THEN ELSE; IF THEN ELSIF IF tipo_transacción = A THEN UPDATE cuentas SET.. ; ELSE UPDATE.. SET.. ; ENDIF; 2.2.2 Control Iterativo: Repite un número de veces un conjunto de sentencias Estructura repetitiva básica. LOOP <sentencias> EXIT WHEN <condición de salida> <sentencias> END LOOP LOOP INSERT INTO EMP (nombre, salario) VALUES (nombre_emp(i), salario_emp(i)); i := i+1; EXIT WHEN i > 3; Esquema WHILE WHILE <condición de permanencia> LOOP <sentencias> END LOOP Bucle FOR numérico con indicación de rango FOR <variable> IN [REVERSE] <r_mín.><r_máx> LOOP <sentencias> Bucle WHILE WHILE i < 4 LOOP INSERT INTO EMP (nombre, salario) VALUES (nombre_emp(i), salario_emp(i)); i := i+1; FOR i IN 1..3 LOOP INSERT INTO EMP (nombre, salario) VALUES (nombre_emp(i), salario_emp(i); i := i+1; Pág. 6 de 8
Ejercicio 1. Crear un bloque que muestre el máximo número de departamento. VARIABLE g_dep_max NUMBER dep_max NUMBER; SELECT max(deptno) INTO dep_max FROM dept; :g_dep_max := dep_max; PRINT g_dep_max Solución b) SET SERVEROUTPUT ON dep_max NUMBER; SELECT max(deptno) INTO dep_max FROM dept; dbms_output.put_line(to_char (dep_max)); Ejercicio 2. Crear un bloque que borre los empleados del departamento 10. Mostrar el número total de registros borrados. SET VERIFY OFF VARIABLE g_resulta VARCHAR2(40) resulta VARCHAR2(40); DELETE FROM emp WHERE deptno = 10; resulta := SQL%ROWCOUNT; :g_resulta := (TO_CHAR(resulta) 'filas borradas.'); COMMIT; SET VERIFY ON PRINT g_resulta Solución b) SET VERIFY OFF SET SERVEROUTPUT ON resulta VARCHAR2(40); DELETE FROM emp WHERE deptno = 10; resulta := SQL%ROWCOUNT; dbms_output.put_line(to_char(resulta) 'f. borradas'); COMMIT; Pág. 7 de 8
Ejercicio 3. Añadir un campo llamado estrellas VARCHAR2(100) a la tabla de empleados. ALTER TABLE emp ADD estrellas VARCHAR2(100) Para el empleado número 1 (empno = 1) añadir al campo estrellas un asterisco por cada 100 $ de su salario. SET VERIFY OFF v_empno emp1.empno%type; v_asteri emp1.estrellas%type := NULL; v_sal emp1.sal%type; COMMIT; SET VERIFY ON SELECT NVL(ROUND(sal100), 0) INTO v_sal FROM emp1 WHERE empno = 1; FOR i IN 1..v_sal LOOP v_asteri := v_asteri '*'; UPDATE emp1 SET estrellas = v_asteri WHERE empno = 1; Ejercicio 4. Crear una tabla (tabla1) con una sola columna (valor). Insertar registros en la tabla mediante un contador que se va incrementando y toma valores desde 1 hasta 10. V_contador INTEGER :=1; LOOP INSERT INTO tabla1 (Valor) VALUES (V_contador); V_contador :=V_contador +1; EXIT WHEN V_contador =10; Ejercicio 5. Modificar el ejercicio anterior utilizando un BUCLE WHILE. Ejercicio 6. Modificar el ejercicio anterior utilizando un BUCLE FOR. Pág. 8 de 8