Los parámetros son un mecanismo muy importante cuando hablamos de funciones o procedimientos en un lenguaje de programación. Adicionalmente en un lenguaje como PL/SQL se pueden definir los parámetros de entrada(por defecto), de salida o ambos.
En éste capítulo trataremos el uso de los parámetros tanto en funciones como en procedimiento PL/SQL.
Parámetros de Entrada
El comportamiento común de un parámetro es como entrada, ésto quiere decir que recibirá un dato almacenado en el parámetro enviado desde el contexto en el que se llama a la función. Si deseamos indicar explícitamente que deseamos el parámetro como de entrada debemos adicionar la palabra reservada IN a la declaración del parámetro de la función.
A manera de ejemplo, crearemos la función OPERAR_NUMEROS.
-- Función que realiza una operación entre 2 números según -- el tipo de operación indicada en el parámetro P_OPERACION: -- + -> SUMA -- - -> RESTA -- * -> MULTIPLICACION -- / -> DIVISION -- Otro -> NULL CREATE OR REPLACE FUNCTION HR.OPERAR_NUMEROS(P_NUMEROA IN NUMBER, P_NUMEROB IN NUMBER, P_OPERACION IN CHAR) RETURN NUMBER IS V_RESULTADO NUMBER; BEGIN CASE WHEN P_OPERACION = '+' THEN V_RESULTADO := P_NUMEROA + P_NUMEROB; WHEN P_OPERACION = '-' THEN V_RESULTADO := P_NUMEROA - P_NUMEROB; WHEN P_OPERACION = '*' THEN V_RESULTADO := P_NUMEROA * P_NUMEROB; WHEN P_OPERACION = '/' THEN -- Controlamos las divisiones por 0 IF P_NUMEROB = 0 THEN V_RESULTADO := 0; ELSE V_RESULTADO := P_NUMEROA / P_NUMEROB; END IF; ELSE -- En caso de que P_OPERACION contenga un caracter -- que no sean +,-,* ó / se devolverá NULL V_RESULTADO := NULL; END CASE; RETURN V_RESULTADO; END;
FUNCTION OPERAR_NUMEROS compilado
Ahora crearemos un bloque PL/SQL anónimo para usarlo
-- Uso de la función HR.OPERAR_NUMEROS DECLARE V_NUMA NUMBER; V_NUMB NUMBER; V_OPERACION CHAR(1); V_RESULTADO NUMBER; BEGIN -- Podemos pasar los valores para los parámetros de entrada. -- usando variables. V_NUMA := 10; V_NUMB := 30; V_OPERACION := '+'; V_RESULTADO := HR.OPERAR_NUMEROS(V_NUMA,V_NUMB,V_OPERACION); DBMS_OUTPUT.PUT_LINE(V_NUMA || V_OPERACION || V_NUMB || '=' || V_RESULTADO); -- Podemos reutilizar las variables cambiando sus valores -- antes de volver a llamar a la función. V_NUMA := 54; V_NUMB := 78; V_OPERACION := '*'; V_RESULTADO := HR.OPERAR_NUMEROS(V_NUMA,V_NUMB,V_OPERACION); DBMS_OUTPUT.PUT_LINE(V_NUMA || V_OPERACION || V_NUMB || '=' || V_RESULTADO); -- También podemos usar constantes en vez de variables para -- asignar valores a parámetros de entrada. V_RESULTADO := HR.OPERAR_NUMEROS(23,56,'*'); DBMS_OUTPUT.PUT_LINE('23*56' || '=' || V_RESULTADO); END;
10+30=40 54*78=4212 23*56=1288
Parámetros de Salida
Los parámetros de salida permiten modificar el valor de una variable externa a la función relacionada con el parámetro. De ésta manera si la función modifica el valor del parámetro, la variable relacionada a éste parámetro tendrá el valor modificado inclusive después de que la función haya terminado de ejecutarse.
Para poder especificar un parámetro como del tipo salida, debemos usar la palabra reservada OUT al momento de declarar el parámetro.
-- Procedimiento que devuelve un texto sobre la fecha actual -- haciendo uso de un parámetro de salida. CREATE OR REPLACE PROCEDURE HR.OBTENER_FECHA(P_TEXTO OUT VARCHAR2) IS BEGIN P_TEXTO := 'La fecha actual es ' || TO_CHAR(SYSDATE,'DD/MM/YYYY'); END;
PROCEDURE OBTENER_FECHA compilado
El procedimiento OBTENER_FECHA, muestra un ejemplo de parámetros de salida. El
DECLARE V_FECHA VARCHAR2(200); BEGIN -- Pasamos la variable V_FECHA a la función HR.OBTENER_FECHA. -- V_FECHA estará referenciada al parámetro P_TEXTO, cualquier cambio -- en P_TEXTO se verá reflejado en V_FECHA posteriormente. HR.OBTENER_FECHA(V_FECHA); DBMS_OUTPUT.PUT_LINE('Valor de V_FECHA: ' || V_FECHA); END;
Valor de V_FECHA: La fecha actual es 08/05/2014
Parámetros de Entrada y Salida
En cada función o procedimiento que contenga parámetros de salida, éstos, son establecidos con valores NULL al inicio de las funciones o procedimientos. ésto quiere decir que si deseamos pasar un valor desde la variable externa relacionada al parámetro, éste valor, será reemplazado con NULL antes de iniciar la función o procedimiento.
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) );
Un parámetro del tipo salida, no tendrá el comportamiento de un parámetro del tipo entrada por defecto. Para permitir que un parámetro permita la salida y entrada de datos de una variable se debe adicionar la palabra reservada IN.
-- Procedimiento que permite registrar un cliente. -- Intentará registrarlo con el valor P_ID, en caso de que el ID -- exista creará uno y devolverá el valor usado CREATE OR REPLACE PROCEDURE HR.REGISTRAR_CLIENTE(P_ID IN OUT NUMBER, P_NOMBRES IN VARCHAR2, P_APELLIDOS IN VARCHAR2, P_FECHA IN DATE) IS V_CONTEO NUMBER; BEGIN -- Se busca si es que el ID existe. SELECT COUNT(cli.id) INTO V_CONTEO FROM hr.cliente cli WHERE cli.id = P_ID; -- En caso de que V_CONTEO exista como ID -- se creará un ID alternativo IF V_CONTEO > 0 THEN DBMS_OUTPUT.PUT_LINE('El id ' || P_ID || ' ya existe.'); SELECT MAX(cli.id) INTO P_ID FROM hr.cliente cli; P_ID := P_ID + 1; DBMS_OUTPUT.PUT_LINE('El id ha sido reemplazado por ' || P_ID || '.'); END IF; 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;
En la función HR.REGISTRAR_CLIENTE el parámetro P_ID actúa como parámetro de entrada y salida. Veamos el uso de la función:
--Uso de la función HR.REGISTRAR_CLIENTE DECLARE V_ID NUMBER; BEGIN -- Intentamos registrar un cliente con ID 12. V_ID := 12; HR.REGISTRAR_CLIENTE(V_ID,'Jhon', 'Quiroz', SYSDATE); DBMS_OUTPUT.PUT_LINE('El valor de V_ID es: ' || V_ID); -- Intentamos registrar otro cliente con el mismo ID. HR.REGISTRAR_CLIENTE(V_ID,'Manuel', 'Prado', SYSDATE); DBMS_OUTPUT.PUT_LINE('El valor de V_ID es: ' || V_ID); END;
Insertado cliente: 12 Jhon Quiroz El valor de V_ID es: 12 El id 12 ya existe. El id ha sido reemplazado por 13. Insertado cliente: 13 Manuel Prado El valor de V_ID es: 13