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.