Los bloques de código anónimos BEGIN .. END, proveen un mecanismo básico para la programación en PL/SQL, pero uno de sus problemas principales es que impiden la reutilización de SCRIPTS, si se tuviera un algoritmo , como por ejemplo, para calcular algún monto según determinados parámetros tendríamos que repetirlo cuantas veces sea necesario.
El uso de procedimientos en PL/SQL supone un buen mecanismo para promover la reutilización de código, además de que permite dividir el código en partes funcionales individuales, adicionalmente los procedimientos pueden ser declarados en bloques anónimos o almacenarnos en la misma base de datos.
DECLARACIÓN DE PROCEDIMIENTOS
La creación de un procedimiento en PL/SQL es similar a la creación de un bloque anónimo. Veamos la sintaxis de un procedimiento:
PROCEDURE <NOMBRE_PROCEDIMIENTO>(<PARAMETROS>) IS <VARIABLES> BEGIN <CÓDIGO PL/SQL> END;
Dónde:
- <NOMBRE_PROCEDIMIENTO>: Es el nombre del procedimiento, el cual se usará para identificarlo.
- <PARÁMETROS>: Los parámetros son como variables, contienen datos que se pueden especificar al momento de llamar al procedimiento.
- <VARIABLES>: Como en un bloque anónimo, en los procedimientos se pueden crear variables, pero éstas variables sólo pueden usadas en código dentro del procedimiento.
- <CÓDIGO PL/SQL>: Es el código propio ejecutado al momento de llamar al procedimiento, se pueden hacer uso de las variables declaradas así como de los parámetros.
Para crear un procedimiento dentro de un bloque anónimo, éste se debe crear dentro de la sección DECLARE ... BEGIN.
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) );
DECLARE -- El procedimiento debe ser declarado dentro de la sección DECLARE .. BEGIN PROCEDURE REGISTRAR_CLIENTE(P_ID NUMBER, P_NOMBRES VARCHAR2, P_APELLIDOS VARCHAR2, P_FECHA DATE) IS BEGIN INSERT INTO hr.cliente(id,nombres,apellidos,fecha_afiliacion) VALUES (P_ID,P_NOMBRES,P_APELLIDOS, P_FECHA); DBMS_OUTPUT.PUT_LINE('Insertado cliente: '|| P_ID || ' ' || P_NOMBRES || ' ' || P_APELLIDOS); END; BEGIN -- Eliminamos los registros anteriores de la tabla CLIENTE para evitar conflictos con sus ID. DELETE FROM hr.cliente; -- Para utilizar el procedimiento creado debemos invocarlo por su nombre, -- adicionalmente, debemos especificar los valores para los parámetros de la función REGISTRAR_CLIENTE(1,'Juan', 'Rosales', SYSDATE); REGISTRAR_CLIENTE(2,'Luis', 'Cabrera', SYSDATE); REGISTRAR_CLIENTE(3,'Pedro', 'Morales', TO_DATE('13/09/80','DD/MM/YYYY')); END;
Insertado cliente: 1 Juan Rosales Insertado cliente: 2 Luis Cabrera Insertado cliente: 3 Pedro Morales
Para comprobar los registros insertados en la tabla HR.CLIENTE, podemos utilizan una simple consulta SQL:
SELECT * FROM hr.cliente
PROCEDIMIENTOS ALMACENADOS
Los procedimientos almacenados permiten "almacenar" los procedimientos para ser utilizados desde cualquier bloque anónimo sin que haya la necesidad de declararlo, adicionalmente se puede utilizar en otros procedimientos. Para crear un procedimiento almacenado debemos anteponer la palabra reservada CREATE y ejecutar el código como si se tratase de un bloque PL/SQL.
-- Agregando la palabra reservada CREATE, -- podemos almacenar el procedimiento en la base de datos -- para poderla reutilizar desde cualquier bloque anónimo -- o procedimiento CREATE PROCEDURE HR.REGISTRAR_CLIENTE(P_ID NUMBER, P_NOMBRES VARCHAR2, P_APELLIDOS VARCHAR2, P_FECHA DATE) IS BEGIN INSERT INTO hr.cliente(id,nombres,apellidos,fecha_afiliacion) VALUES (P_ID,P_NOMBRES,P_APELLIDOS, P_FECHA); DBMS_OUTPUT.PUT_LINE('Insertado cliente: '|| P_ID || ' ' || P_NOMBRES || ' ' || P_APELLIDOS); END;
Si un procedimiento se compila correctamente,la pestaña Salida de Script del SQL Developer mostrará un mensaje indicando que el procedimiento se ha compilado .
Finalmente, podremos usar el procedimiento desde cualquier bloque anónimo sin necesidad de de declarar dicho procedimiento.
BEGIN DELETE FROM hr.cliente; HR.REGISTRAR_CLIENTE(1,'Miguel', 'Rosales', SYSDATE); HR.REGISTRAR_CLIENTE(2,'Pedro', 'Rodriguez', SYSDATE); HR.REGISTRAR_CLIENTE(3,'Manuel', 'Licierns', TO_DATE('13/09/80','DD/MM/YYYY')); END;