Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INDICE..........................................................................................................................................1
1.4.1. La salida......................................................................................................... 5
1.4.2. La entrada..................................................................................................... 6
1.4.3.1. La Selección...................................................................................... 7
1.4.3.2. La Iteración........................................................................................9
1.5.1. Procedimientos......................................................................................... 12
1.5.2. Funciones.................................................................................................... 15
2.1. Definición................................................................................................................ 17
2.2. Tipos..........................................................................................................................19
REFERENCIA BIBLIOGRÁFICA............................................................................................24
1. PL/SQL (Procedural Language/Structured Query
Language)
Sabemos cómo interrogar a la base de datos utilizando las
sentencias SQL, que es un lenguaje declarativo con fuerte base
matemática basado sobre el álgebra relacional. SQL ofrece una gran
potencia para interrogar y administrar la base de datos. Sin embargo,
se puede percibir que hay ciertos tipos de preguntas o acciones que
no es posible realizar, se necesita un lenguaje más potente, para ello
los SMBDs desarrollaron un lenguaje procedimental, que va a
extender la potencia que ofrece SQL, y el resultado es el PL/SQL
(Procedural Language/Structured Query Language), un lenguaje de
programación incrustado soportado por la mayoría de los SMBDs.
PL/SQL soporta el lenguaje de consultas, es decir el SQL, pero
no soporta ordenes de definición de datos (DDL) ni de control de
datos (DCL). PL/SQL además va a incluir las características propias de
un lenguaje procedimental:
● El uso de variables.
● Estructuras de control de flujo y toma de decisiones.
● Control de excepciones.
● Reutilización del código a través de paquetes,
procedimientos y funciones.
1
De acuerdo con la sintaxis, lo único obligatorio para crear
un bloque anónimo en PL/SQL son las palabra clave BEGIN Y
END;.
2
● VARCHAR2 (Carácter de longitud variable): Almacena
datos de tipo carácter empleando solo la cantidad
necesaria aun cuando la longitud máxima sea mayor.
Ejemplos:
a. Declaramos una variable tipo Fecha y no la inicializamos.
fechaNacimiento DATE;
3
Como se indicó anteriormente, también existen los
atributos de tipo: %TYPE y %ROWTYPE. Son atributos especiales
que permiten declarar una variable basada en cómo sea el tipo de
otra variable previamente declarada, por ejemplo, se puede
hacer que una variable sea del mismo tipo que un campo de una
tabla de la base de datos. Esto tiene la ventaja de que si en un
futuro se cambia el tipo del campo, todas las variables que hayan
sido declaradas así se cambiarán automáticamente, y el código
seguirá funcionando.
Por ejemplo:
nombreCliente Clientes.Nombre%TYPE;
4
SELECT * INTO regCliente FROM Clientes WHERE CodigoCliente=1;
5
dbms_output.put_line('Nombre del Cliente: ' || nombreCliente);
1.4.2. La entrada
Para leer valores de teclado hay que hacer una
asignación a una variable y poner el símbolo & seguido de una
cadena de caracteres que se mostrará al pedir la entrada, esta
cadena debe ir sin espacios en blanco, se recomienda usar
guiones bajos para separar palabras y que no sea muy larga, el
problema de esta pseudoentrada de valores por teclado, es
que nada más ejecutar el procedimiento lee por teclado todas
las variables que se hayan asignado de esta forma en nuestro
código, independientemente del lugar en donde se haya escrito
la instrucción.
● Entrada de valores a variables por teclado
nombeVariable := &Texto_a_mostrar;
6
II Altura II ' TIENE UN AREA DE: ' ||Base*Altura/2);
END;
/
SOL>
1.4.3.Estructuras de Control
1.4.3.1. La Selección
● Sentencias IF
Evalúa una expresión y en función del valor de que esta
expresión sea verdadera o falsa se hacen unas acciones u
otras.
Sintaxis:
IF condición THEN
instrucciones;
[ELSIF condición THEN
instrucciones;]
[ELSE
instrucciones;]
END IF;
Por Ejemplo:
IF A>B THEN
DBMS_OUTPUT.PUT_LINE(A|| ' ES MAYOR QUE || B);
END IF;
Otra forma bastante común es realizar una o varias
acciones en caso de que la acción sea verdadera y otra u
otras cuando sea falsa.
IF A>B THEN
DBMS_GUTPUT.PUT_LINE(A| j ' ES MAYOR QUE MI B) ;
7
ELSE
DBMS_0UTPUT.PUT_LINE(A1 I ' NO ES MAYOR QUE MI B);
END IF;
● La sentencia CASE
8
DBMS_OUTPUT.PUT_LINE('EMPATAN LOS EQUIPOS');
WHEN '2' THEN
DBMS_OUTPUT.PUT_LINE('GANA EL EQUIPO VISITANTE');
ELSE
DBMS_OUTPUT.PUT_LINE('NO ES UN VALOR VÁLIDO');
END CASE;
1.4.3.2. La Iteración
Los bucles repiten una sentencia o un grupo de
sentencias varias veces. Hay varios tipos de bucles que
dependiendo de si se sabe o no el número de veces que
se van a repetir las acciones, o si por el contrario
conocemos la condición de repetición o de salida del
bucle, será más interesante usar un tipo de bucle que
otro. En PL/SQL existen tres tipos de bucles:
Bucle básico. LOOP. Acciones repetitivas sin
condiciones globales.
Bucle FOR. Acciones repetitivas basándose en un
contador. Número conocido de vueltas.
Bucle WHILE. Basándose en una condición.
9
√ Usarlo con la opción WHEN y cuando se haga cierta
la condición salga del bucle.
Ejemplo usando WHEN:
bucleloopwhen.sql
SET SERVEROUTPUT ON
DECLARE
N INT:=0;
LOOP
N:=N+1;
EXIT WHEN N >=100;
END LOOP;
bucleloopif.sql
SET SERVEROUTPUT ON
DECLARE
N INT:=0;
LOOP
N:=N+1;
IF N >=100 THEN
EXIT;
END IF;
END LOOP;
END;
10
Contador INT := 0;
BEGIN
WHILE Contador <= 100 LOOP
DBMS_OUTPUT.PUT_LINE(Contador);
Contador := Contador + 1;
END LOOP;
END;
/
11
1.5. Estructuras funcionales: Procedimientos y
Funciones
PL/SQL, como la mayoría de los lenguajes de programación,
tanto los procedimentales como los orientados a objetos, permiten
que unas determinadas sentencias formen parte de lo que se
llama un procedimiento (método en Programación Orientada a
Objetos) o función. Permitiendo la reutilización del código.
1.5.1. Procedimientos
Un procedimiento va a agrupar un bloque de código que
va a ser ejecutado cada vez que el procedimiento se invoque.
Sintaxis:
CREATE [OR REPLACE] PROCEDURE [esquema] .nomproc
(nombre_parámetro {IN | OUT | IN OUT} tipo de dato, ..)
{IS | AS}
Declaración de variables;
Declaración de constantes;
Declaración de cursores;
BEGIN
Cuerpo del subprograma PL/SQL;
[EXCEPTION]
Bloque de excepciones PL/SQL;
END;
/
12
● Parámetros en procedimientos y funciones
Sintaxis:
(nombre_parámetro {IN | OUT | IN OUT} tipo de dato, ...)
DECLARE
NI INT:=3;
N2 INT:=10;
BEGIN
PR0_EJEMPL0(N1,N2) - - LLAMADA AL PROCEDIMIENTO
13
END;
/
prointercambio.sql
CREATE OR REPLACE PROCEDURE
INTERCAMBIO(A IN OUT NUMBER, B IN OUT NUMBER) AS
AUX NUMBER;
BEGIN
AUX:=A;
A:=B;
B:=AUX;
END;
/
14
A continuación se crea un programa desde el que llamar
al procedimiento intercambio:
intercambia.sql
DECLARE
NI NUMBER:=3;
N2 NUMBER:=6;
BEGIN
DBMS_GUTPUT.PUT_LINE('N1: '||N1||'N2: '||N2);
INTERCAMBIO(NI,N2);
DBMS_0UTPUT.PUT_LINE('N1: '||N1||'N2: '||N2);
END;
/
SQL> @prointercambio.sql
Procedimiento creado.
SQL> @intercambia.sql;
NI: 3 N2: 6
NI: 6 3
N2:
1.5.2. Funciones
Las funciones en PL/SQL son muy parecidas a los
procedimientos, la principal diferencia es que la función va a
devolver, cuando es llamada o invocada, un resultado que será
de un tipo de dato concreto, esto hay que indicarlo en la
cabecera con RETURN tipo-de-dato tal y como se puede ver
en la sintaxis.
Sintaxis:
CREATE OR REPLACE FUNCTION
[esquema].nombre-función (nombre-parámetro tipo-de-dato, ..)
RETURN tipo-de-dato
{IS, AS}
Declaración de variables;
Declaración de constantes;
Declaración de cursores;
BEGIN
Cuerpo del subprograma PL/SQL;
— Alguna sentencia debe ser del estilo RETURN valor;
EXCEPTION
Bloque de excepciones PL/SQL;
END;
/
15
Al menos debe haber una orden RETURN en el código de
la función que devuelva un valor del mismo tipo que fue
declarada.
16
También podemos invocar a un procedimiento desde el
intérprete de comandos de SqlPlus usando las ordenes CALL o
EXEC.
CALL procedimiento_ejemplo1(100,2);
EXEC procedimiento_ejemplo1(100,2);
55
Llamada terminada.
17
DECLARE nombre_cursor CURSOR FOR <consulta>;
Ejemplo:
● LECTURA
La lectura de los resultados de un cursor se hace con el
comando FETCH. Este nos permite acceder a la primera fila
generada por la consulta. Si se vuelve a usar el cursor pasa a
apuntar a la segunda fila, luego a la tercera y así
sucesivamente hasta que el cursor no tenga resultados que
referenciar.
18
● CIERRE
CLOSE nombre_cursor;
2.2. Tipos
2.2.1. Cursores Implícitos
Los implícitos no necesitan ser declarados por el
programador, están en todas las sentencias del DML y SELECT
de PL/SQL que devuelven una sola fila. En caso de que
devuelva más de una fila, la consulta produciría un error que
deberíamos de tratar en el bloque de excepciones
(EXPECPTION).
Ejemplo:
DECLARE
Isalario empleados.salario%TYPE;
Idni empleados.dni%TYPE;
BEGIN
SELECT salario, dni
INTO Isalario, Idni
FROM empleados
WHERE nombre=’Juan’ AND apellidos=’Rodrigo Comas’;
/*Resto de sentencias del bloque*/
END;
DECLARE
CURSOR cemp IS
SELECT salario, cedula
FROM empleados
cemp_rec cemp%ROWTYPE
19
BEGIN
FOR cemp_rec IN cemp
LOOP
DBMS_OUTPUT.PUT_LINE(cemp_rec.cedula ||’’|| cemp_rec.salario);
END LOOP;
END;
DECLARE
CURSOR cemp(pnombre IN VARCHAR2) IS
SELECT salario, cedula
FROM empleados
WHERE nombre = pnombre;
cemp_rec cemp%ROWTYPE;
vnombre VARCHAR2()20;
BEGIN
vnombre:=’Juan’;
DBMS_OUTPUT.PUT_LINE(‘Sueldo de los empleados con
nombre’||’’|| vnombre);
OPEN cemp(vnombre);
LOOP
FETCH cemp INTO cemp_rec;
DBMS_OUTPUT.PUT_LINE(cemp_rec.cedula ||’’|| cemp_rec.salario);
20
EXIT WHEN cemp%NOTFOUND; --Último registro
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘Número de empleados procesados’ ||
cemp%ROWCOUNT);
CLOSE cemp;
END;
21
FETCH [ NEXT | PRIOR | FIRST | LAST ] FROM cursor_name
FETCH ABSOLUTE n FROM cursor_name
FETCH RELATIVE n FROM cursor_name
UPDATE table_name
SET ...
WHERE CURRENT OF cursor_name
DELETE
FROM table_name
WHERE CURRENT OF cursor_name
Para actualizar los datos del cursor hay que ejecutar una
sentencia UPDATE especificando la cláusula WHERE CURRENT
OF cursor_name.
Ejemplo:
DECLARE
22
CURSOR cpaises IS
select CO_PAIS, DESCRIPCION, CONTINENTE from paises
FOR UPDATE;
co_pais VARCHAR2(3);
descripcion VARCHAR2(50);
continente VARCHAR2(25);
BEGIN
OPEN cpaises;
FETCH cpaises INTO co_pais,descripcion,continente;
WHILE cpaises%found
LOOP
UPDATE PAISES SET CONTINENTE = CONTINENTE || '.'
WHERE CURRENT OF cpaises;
FETCH cpaises INTO co_pais,descripcion,continente;
END LOOP;
CLOSE cpaises;
COMMIT;
END
23
REFERENCIA BIBLIOGRÁFICA
Sin autor. Ejemplo de Cursores. Consultado
https://sites.google.com/a/espe.edu/ec/bases-de-datos-
ii/conclusion/cursoresejemplos-de-cursores el 19May2021 a la
02:39 pm.
24