Como se indicó desde el principio, la utilidad de PL/SQL es la manipulación de datos, es por éste motivo que se pueden usar las siguientes sentencias DML de SQL para consultar, insertar o manipular datos:
SELECT INTO
INSERT INTO
UPDATE
EXECUTE IMMEDIATE
SELECT INTO
La sentencia SELECT INTO permite asignar valores a una variable a partir de una consulta SELECT. Por cada ítem o columna seleccionada debe existir una variable del mismo tipo de dato en la cláusula INTO:
DECLARE
V_PROMEDIO NUMBER;
BEGIN
SELECT AVG(salary) INTO V_PROMEDIO
FROM hr.employees;
DBMS_OUTPUT.PUT_LINE('El promedio de salario es: ' || V_PROMEDIO);
END;
El promedio de salario es: 6461,831775700934579439252336448598130841
En el script anterior, la función AVG (Average - Promedio) obtiene el sueldo(salary) promedio de los empleados(hr.employees), el valor calculado es asignado a la variable V_PROMEDIO a través de la cláusula INTO.
Ahora veámos un ejemplo obteniendo los datos personales y valor de comisión de un determinado empleado:
DECLARE
V_NOMBRES VARCHAR2(200);
V_APELLIDOS VARCHAR2(200);
V_COMISION NUMBER;
V_ID_EMPLE NUMBER := 161; --Para probar, puede cambiar el valor
--de la variable V_ID_EMPLE(ejem,168).
BEGIN
-- Obtenemos los apellidos, nombres y comisión
-- del empleado V_ID_EMPLE, en éste caso con id 100
SELECT last_name, first_name, commission_pct
INTO V_APELLIDOS, V_NOMBRES, V_COMISION
FROM hr.employees
WHERE employee_id = V_ID_EMPLE; --Se pueden usar variables
--para filtrar registros con WHERE
DBMS_OUTPUT.PUT_LINE('Apellidos:' || V_APELLIDOS);
DBMS_OUTPUT.PUT_LINE('Nombres:' || V_NOMBRES);
IF V_COMISION IS NULL THEN
DBMS_OUTPUT.PUT_LINE('El empleado no tiene comisión asignada');
ELSE
DBMS_OUTPUT.PUT_LINE('La comisión por venta del empleado es: '
|| (V_COMISION*100) || '%');
END IF;
END;Apellidos:Sewall Nombres:Sarath La comisión por venta del empleado es: 25%
INSERT, UPDATE y DELETE
Las sentencias DML INSERT y UPDATE funcionan de manera directa en PL/SQL, adicionalmente puede hacer uso de variables y valores constantes. Para realizar una prueba:
-- Created with Kata Kuntur - Data Modeller -- Version: 2.5.0 -- Web Site: http://katakuntur.jeanmazuelos.com/ -- If you find a bug, please report it at: -- http://pm.jeanmazuelos.com/katakuntur/issues/new -- Database Management System: Oracle DataBase -- Diagram: PL/SQL Tutorial -- Author: Jean Mazuelos -- Date and time: 21/04/2014 15:07:51 -- GENERATING TABLES CREATE TABLE HR.CLIENTE ( id NUMBER NOT NULL, nombres VARCHAR(200) NOT NULL, apellidos VARCHAR(200) NOT NULL, fecha_afiliacion DATE NOT NULL, PRIMARY KEY(id) );
Ahora que hemos creado la tabla CLIENTE, procedemos a llenarla con sentencias INSERT desde PL/SQL:
DECLARE
V_NOMBRES VARCHAR2(200);
V_APELLIDOS VARCHAR2(200);
V_FECHA DATE;
BEGIN
--Podemos insertar registros a partir de variables
V_NOMBRES := 'Jean';
V_APELLIDOS := 'Mazuelos';
V_FECHA := SYSDATE;
INSERT INTO hr.cliente(id,nombres,apellidos,fecha_afiliacion)
VALUES (1,V_NOMBRES,V_APELLIDOS, V_FECHA);
DBMS_OUTPUT.PUT_LINE('Se ha insertado al cliente' || V_NOMBRES || ' ' || V_APELLIDOS);
-- O también se pueden usar valores constantes
INSERT INTO hr.cliente(id,nombres,apellidos,fecha_afiliacion)
VALUES (2,'Pedro', 'GONZALES', TO_DATE('13/12/1986','DD/MM/YYYY'));
DBMS_OUTPUT.PUT_LINE('Se ha insertado al cliente Pedro Gonzales');
END;Se ha insertado al cliente Jean Mazuelos Se ha insertado al cliente Pedro Gonzales
DD -> día
MM -> mes
YYYY -> año
Para verificar los cambios podemos usar la sentencia:
SELECT * FROM hr.cliente
Al igual que el caso de las sentencias INSERT, podemos usar sentencias UPDATE.
DECLARE
V_APELLIDOS VARCHAR2(200);
V_ID NUMBER;
BEGIN
--Podemos usar variables tanto para asignar los nuevos valores
--o usarlos en el filtro WHERE.
V_APELLIDOS := 'Mazuelos Mendez';
V_ID := 1;
UPDATE hr.cliente SET apellidos = V_APELLIDOS
WHERE id = V_ID;
DBMS_OUTPUT.PUT_LINE('Se ha modificado el cliente con id ' || V_ID);
--O podemos usar valores constantes
UPDATE hr.cliente SET apellidos = 'Gonzales Lurés'
WHERE id = 2;
DBMS_OUTPUT.PUT_LINE('Se ha modificado el cliente con id 2.');
END;Se ha modificado el cliente con id 1 Se ha modificado el cliente con id 2.
SELECT * FROM hr.cliente
La sentencia DELETE funciona de igual manera
BEGIN DELETE FROM hr.cliente WHERE id=2; END;
SELECT * FROM hr.cliente
CURSOR IMPLÍCITO - SELECT
En algunos casos necesitaremos realizar una sentencia SELECT. La única manera de manipular registros a través de una sentencia SELECT es usando cursores. En PL/SQL existen varios tipos de cursores, uno de los más sencillos de usar son los cursores implícitos a través de la sentencia FOR - LOOP.
BEGIN
DBMS_OUTPUT.PUT_LINE('Mostrando los empleados con comisión mayor al 30%');
-- Con la sentencia FOR .. LOOP se pueden crear cursores implícitos
FOR V_REGISTRO IN (SELECT first_name, last_name, commission_pct
FROM hr.employees
WHERE commission_pct > 0.3)
LOOP
--El bloque LOOP ... END LOOP; ejecutará el mismo código
-- por cada registro de la sentencia SELECT del LOOP
DBMS_OUTPUT.PUT_LINE('======================================================');
DBMS_OUTPUT.PUT_LINE('Nombres: ' || V_REGISTRO.first_name);
DBMS_OUTPUT.PUT_LINE('Apellidos: ' || V_REGISTRO.last_name);
DBMS_OUTPUT.PUT_LINE('Comisión: ' || (V_REGISTRO.commission_pct*100) || '%');
END LOOP;
END;Mostrando los empleados con comisión mayor al 30% ====================================================== Nombres: John Apellidos: Russell Comisión: 40% ====================================================== Nombres: Janette Apellidos: King Comisión: 35% ====================================================== Nombres: Patrick Apellidos: Sully Comisión: 35% ====================================================== Nombres: Allan Apellidos: McEwen Comisión: 35%
En el ejemplo anterior, la sentencia de control FOOR.. LOOP sirve para "recorrer" todos los registros obtenidos de una sentencia SQL (SELECT first_name, last_name, commission_pct FROM hr.employees WHERE commission_pct > 0.3). La variable V_REGISTRO es declara dentro de las cláusulas FOR .. IN, y ésta variable será utilizada para acceder a las columnas de la consulta.