Está en la página 1de 8

Departamento de Lenguajes y Sistemas Informticos

E.T.S. Ingeniera Informtica. Universidad de Sevilla


Avda Reina Mercedes s/n. 41012 Sevilla
Tlf/Fax 954 557 139 E-mail lsi@lsi.us.es Web www.lsi.us.es

Diseo de Bases de Datos

Diseo de bases de datos


Anexo B
PL/SQL

Sevilla, febrero 2007


V 2007.02.1

e.t.s. ingeniera
informtica

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

Indice
1

INTRODUCCIN..................................................................................................................................................................... 3
1.1

DISEO Y RENDIMIENTO. .................................................................................................................................................. 3


ESTRUCTURA DEL LENGUAJE PL/SQL. ............................................................................................................................ 3

2.1

USO DE VARIABLES. ............................................................................................................................................................ 4


Declaracin de variables.......................................................................................................................................................................................4
Tipos de variables .................................................................................................................................................................................................4
La propiedad %TYPE..........................................................................................................................................................................................5
La propiedad %ROWTYPE. ..............................................................................................................................................................................5
2.2
ESTRUCTURAS DE CONTROL. .............................................................................................................................................. 6
2.2.1
Control Condicional: ............................................................................................................................................................................................6
2.2.2
Control Iterativo: ...................................................................................................................................................................................................6
2.1.1
2.1.2
2.1.3
2.1.4

EJERCICIO 1. ...................................................................................................................................................................................... 7
EJERCICIO 2....................................................................................................................................................................................... 7
EJERCICIO 3....................................................................................................................................................................................... 8
EJERCICIO 4....................................................................................................................................................................................... 8
EJERCICIO 5....................................................................................................................................................................................... 8
EJERCICIO 6....................................................................................................................................................................................... 8

Pg. 2 de 8

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

1 Introduccin.
PL/SQL es un lenguaje procedural propietario de Oracle.
Combina:
la potencia de definicin y manipulacin de datos de SQL
la potencia de procesamiento de los lenguajes procedurales.
Tiene estructuras de bloques; las unidades bsicas de un programa PL/SQL son bloques lgicos.
[DECLARE /* comienza parte de declaraciones */
.....Declaraciones de objetos]
BEGIN /* comienza parte ejecutable */
.....Comandos y Sentencias SQL y PL/SQL
[EXCEPTION /* comienza parte de tratamiento excepciones */
.....Tratamiento de excepciones]
END;
Un bloque PL/SQL puede ser un bloque annimo, un procedimiento o una funcin.
La estrategia de diseo PL/SQL es la modularidad; reducir la complejidad del problema dividiendo el
problema en problemas ms simples y fciles de implementar (definicin de procedimientos y funciones
almacenados)

1.1

Diseo y rendimiento.

Diseando las aplicaciones en base a una librera de subprogramas almacenados, podemos eliminar el
Cdigo Redundante e incrementar la Productividad. As mismo, se reduce la probabilidad de que existan
errores en el cdigo aumentando la Integridad y Consistencia de las aplicaciones.
Al crear un procedimiento, funcin package, Oracle automticamente lo compila y el cdigo objeto lo
carga en una rea de memoria compartida de la SGA. As mismo, cuando se dispara un trigger y el cdigo
objeto no est en la SGA, Oracle lo compila y carga el cdigo objeto en la SGA. Si varios usuarios invocan
un procedimiento funcin que est cargado en la SGA disparan un trigger, no son necesarios accesos a
disco ni hay que cargar el cdigo 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 PL/SQL.


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

Pg. 3 de 8

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

PL/SQL incorpora las sentencias DML (INSERT, UPDATE, DELETE) y las sentencias SELECT de
SQL.
PL/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 seccin declarativa de un bloque PL/SQL.
Permiten pasar valores a un subprograma PL/SQL mediante parmetros. 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 entrada/salida.
2.1.1 Declaracin de variables.
La sintaxis para la declaracin de variables es:
Nombre_variable

[CONSTANT] tipo_de_dato

[NOT NULL] [ := DEFAULT expresin]

CONSTANT Declara la variable como constante. Su valor no puede cambiar. Debe ser inicializada.
DECLARE
Departamento
Valor
Fecha_nac
Fecha_contrato

VARCHAR2(10)
CONSTANT
DATE;
DATE

NOT NULL := C1;


NUMBER(2) := 12;
DEFAULT SYSDATE;

2.1.2 Tipos de variables .


Los tipos de datos de las variables PL/SQL son: Escalar, Compuesto y LOB
Existen otras variables que no son PL/SQL y podemos clasificar en: variables BIND y variables HOST.

Variables tipo escalar.


BINARY-INTEGER Almacena enteros con signo.Subtipos:NATURAL, POSITIVO
NUMBER [(precisin, escala)]. Almacena nmeros con punto fijo o flotante
CHAR
[(longitud mxima)]. Almacena cadenas de caracteres de longitud fija.
VARCHAR2 (longitud mxima). 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. Direccin fsica de una fila de la BD

Tipo compuesto.
Los tipos compuestos son las tablas y registros PL/SQL 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 PL/SQL.
Para utilizarlas en PL/SQL tienen que llevar como prefijo dos puntos (:).

Pg. 4 de 8

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

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 PL/SQL para contener los valores de una columna de una tabla, es
necesario asegurar que la variable es del mismo tipo y precisin que los datos que va a contener. De no ser
as se producir un error de ejecucin.
Para utilizar el atributo %TYPE en lugar de un tipo de dato en la declaracin de la variable, se aade
%TYPE al nombre de la columna o al nombre de la variable previamente declarada.
Sintaxis:
<nom_variable
<nombre_variable

propietario.tabla.columna%TYPE>;
variable_PL/SQL%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.:

DECLARE
EMP_REC
EMP%ROWTYPE ;
..
BEGIN
SELECT * INTO EMP_REC FROM EMP ..
END ;

Para hacer referencia a un campo:


nombre_variable_registro.nombre_columna
Ej.:
EMP_REC.ename := Jos ;
Es ms til utilizar %ROWTYPE que una variable tipo registro PL/SQL definido por el usuario ya que de
est forma no es necesario conocer el nmero y tipo de datos de la tabla subyacente y evita hacer
modificaciones cuando la estructura de la tabla cambie.

Pg. 5 de 8

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

2.2 Estructuras de control.


2.2.1

Control Condicional:
IF THEN ; IF THEN ELSE;

IF THEN ELSIF

IF tipo_transaccin = A
THEN
UPDATE cuentas SET .. ;
ELSE
UPDATE .. SET .. ;
ENDIF;
2.2.2 Control Iterativo:
Repite un nmero de veces un conjunto de sentencias
Estructura repetitiva bsica.
LOOP
<sentencias>
EXIT WHEN
<condicin de salida>
<sentencias>
END LOOP

BEGIN
LOOP
INSERT INTO EMP (nombre, salario)
VALUES (nombre_emp(i), salario_emp(i));
i := i+1;
EXIT WHEN i > 3;
END LOOP;
END;

Esquema WHILE

WHILE <condicin de permanencia> LOOP


<sentencias>
END LOOP

Bucle WHILE
BEGIN
WHILE i < 4 LOOP
INSERT INTO EMP (nombre, salario)
VALUES (nombre_emp(i), salario_emp(i));
i := i+1;
END LOOP;
END;

Bucle FOR numrico con indicacin de rango


FOR <variable> IN [REVERSE] <r_mn.><r_mx>

LOOP
<sentencias>
END LOOP;

BEGIN
FOR i IN 1..3 LOOP
INSERT INTO EMP (nombre, salario)
VALUES (nombre_emp(i), salario_emp(i);
i := i+1;
END LOOP;
END;

Pg. 6 de 8

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

Ejercicio 1.
Crear un bloque PL/SQL que muestre el mximo nmero de departamento.
VARIABLE g_dep_max
NUMBER
DECLARE
dep_max NUMBER;
BEGIN
SELECT max(deptno)
INTO dep_max
FROM dept;
:g_dep_max := dep_max;
END;
/
PRINT g_dep_max
Solucin b)
SET SERVEROUTPUT ON
DECLARE
dep_max NUMBER;
BEGIN
SELECT max(deptno)
INTO dep_max
dbms_output.put_line(TO_CHAR (dep_max));
END;
/

FROM dept;

Ejercicio 2.
Crear un bloque PL/SQL que borre los empleados del departamento 10.
Mostrar el nmero total de registros borrados.
SET VERIFY OFF
VARIABLE g_resulta VARCHAR2(40)
DECLARE
resulta VARCHAR2(40);
BEGIN
DELETE
FROM emp WHERE deptno = 10;
resulta := SQL%ROWCOUNT;
:g_resulta := (TO_CHAR(resulta) || 'filas borradas.');
COMMIT;
END;
/
SET VERIFY ON
PRINT g_resulta
Solucin b)
SET VERIFY OFF
SET SERVEROUTPUT ON
DECLARE
resulta VARCHAR2(40);
BEGIN
DELETE
FROM emp WHERE deptno = 10;
resulta := SQL%ROWCOUNT;
dbms_output.put_line(TO_CHAR(resulta)||'f. borradas');
COMMIT;
END;
/
Pg. 7 de 8

DBD Anexo B

PL/SQL

Sevilla, Febrero 2007, V 2007.02.1

Ejercicio 3.
Aadir un campo llamado estrellas VARCHAR2(100) a la tabla de empleados.
ALTER TABLE emp ADD estrellas VARCHAR2(100)
Para el empleado nmero 1 (empno = 1) aadir al campo estrellas un asterisco por cada 100 $ de su salario.
SET VERIFY OFF
DECLARE
v_empno
emp1.empno%TYPE;
v_asteri
emp1.estrellas%TYPE := NULL;
v_sal
emp1.sal%TYPE;
BEGIN
SELECT NVL(ROUND(sal/100), 0)
INTO v_sal FROM emp1 WHERE empno = 1;
FOR i IN 1..v_sal
LOOP
v_asteri := v_asteri || '*';
END LOOP;
UPDATE emp1
SET estrellas = v_asteri
WHERE empno = 1;
COMMIT;
END;
/
SET VERIFY ON

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.
DECLARE
V_contador INTEGER :=1;
BEGIN
LOOP
INSERT INTO tabla1 (Valor) VALUES (V_contador);
V_contador :=V_contador +1;
EXIT WHEN V_contador =10;
END LOOP;
END;

Ejercicio 5.
Modificar el ejercicio anterior utilizando un BUCLE WHILE.

Ejercicio 6.
Modificar el ejercicio anterior utilizando un BUCLE FOR.

Pg. 8 de 8

También podría gustarte