Sie sind auf Seite 1von 3

PL/SQL Procedimientos Almacenados

Construyendo con Bloques en PL/SQL


Publicado en

Marzo/Abril 2011

Ejecutando SQL dentro de bloques PL/SQL

PL/SQL es un lenguaje de programación de base de datos. Casi todos


los programas que escribiremos en PL/SQL leerán desde, o
escribirán en, una base de datos Oracle utilizando SQL. Aunque
estas series asumen que se conoce SQL, debemos estar conscientes
de la forma en que llamamos a las sentencias desde un bloque
PL/SQL.

Y aquí hay algunas buenas noticias: Oracle hace que sea muy fácil
escribir y ejecutar sentencias SQL en PL/SQL. La mayor parte de
las veces, simplemente escribiremos las sentencias SQL
directamente en nuestro bloque PL/SQL y después agregaremos el
código necesario para la interfaz entre las sentencias SQL y el
código PL/SQL.

Supongamos, por ejemplo, que tenemos una tabla llamada empleados,


con una columna clave primaria id_empleado, y una columna
apellido. Podemos ver el apellido del empleado con ID 138, como
sigue:

SELECT apellido
FROM empleados
WHERE id_empleado = 138

Ahora querríamos ejecutar esta misma consulta dentro de nuestro


bloque PL/SQL y desplegar el nombre. Para hacer esto,
necesitaremos “copiar” el apellido desde la tabla a una variable
local, lo cual podemos hacer con la cláusula INTO:

DECLARE
v_apellido empleados.apellido%TYPE;
BEGIN
SELECT apellido
INTO v_apellido
FROM empleados
WHERE id_empleado = 138;

DBMS_OUTPUT.put_line(v_apellido);
END;
Primero declaramos una variable local, y haciendo esto
introducimos otra característica elegante de PL/SQL: la capacidad
de fijar el tipo de datos de nuestra variable en función del tipo
de datos de una columna en una tabla (esto será profundizado más
adelante en esta serie)

Después ejecutamos una consulta contra la base, obteniendo el


apellido del empleado y asignándolo directamente en la variable
v_apellido.

Por supuesto, querremos hacer más que ejecutar sentencias SELECT


en PL/SQL, también querremos insertar, modificar y eliminar datos
desde PL/SQL. Aquí hay ejemplos de cada uno de esos tipos de
sentencias DML:

• Eliminamos todos los empleados en el departamento 10 y mostramos


cuántas tuplas fueron eliminadas:

DECLARE
v_id_departamento empleados.id_departamento%TYPE := 10;
BEGIN
DELETE FROM empleados
WHERE id_departamento = v_id_departamento;

DBMS_OUTPUT.put_line(SQL%ROWCOUNT);
END;

Referenciamos la variable PL/SQL directamente dentro de la


sentencia DELETE. Cuando el bloque se ejecuta, la variable se
reemplaza con el valor actual, 10, y el DELETE es ejecutado por
el motor de SQL. SQL%ROWCOUNT es un atributo especial de cursor
que retorna el número de tuplas modificadas por la última
sentencia DML ejecutada en nuestra sesión.

• Modificar todos los empleados en el departamento 10 con un 20%


de incremento salarial.

DECLARE
v_id_departamento empleados.id_departamento%TYPE := 10;
BEGIN
UPDATE empleados
SET salario = salario * 1.2
WHERE id_departamento = v_id_departamento;

DBMS_OUTPUT.put_line(SQL%ROWCOUNT);
END;

Insertar un nuevo empleado en la tabla.

BEGIN
INSERT INTO empleados (id_empleado
, apellido
, id_departamento
, salario)
VALUES (100
, 'Feuerstein'
, 10
, 200000);

DBMS_OUTPUT.put_line(SQL%ROWCOUNT);
END;

En este bloque, proveímos los valores de las columnas como


literales, en lugar de variables, directamente dentro de la
sentencia SQL.

PL/SQL Actividades practicas

a) Dada una tabla (Paises) en la Base de Datos, que almacena el


codigo de pais (numérico, con incremento manual en cada
inserción, 1,2,3,4..n) y el nombre del pais.
cree un procedimiento almacenado que permita agregar un país
a la tabla solo si este no existe previamente, de ser así,
debe informar que el país ya existe, o indicar si este fue
almacenado.

CREATE TABLE PAISES(


ID_PAIS NUMBER(5),
NOMBRE VARCHAR2(50)
);

INSERT INTO PAISES VALUES (1,'PERU');

b) Escribir un procedimiento Alta_Job para insertar un nuevo


cargo en la tabla Empleos:
el Job_Id debe generarse sumando 1 al máximo Job_Id existente
el nombre del cargo (CARGO) debe ser informado por parámetro.
en la base de datos todos los nombres de Cargos están en
mayúsculas,
asentar en la base de datos este insert (Commit).

c) Crear un procedimiento Upd_Job para actualizar los nombres


de los cargos:
Informar el job_id y el nuevo nombre del Cargo mediante dos
parámetros.
Si el job_id no existe, informar mediante un mensaje y
cancelar el procedimiento.

Das könnte Ihnen auch gefallen