Capítulo 8 - Parámetros de entrada y salida

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.

No es necesario especificar el tipo de parámetro cuando sólo lo vamos a utilizar como parámetro de entrada, pero es recomendable hacerlo.
-- 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.

Cuando un parámetro es del tipo salida, sólo se pueden pasar variables a la función, en caso de intentar usar una constante el motor PL/SQL mostrará un error al momento de compilar la función.

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.

La tabla HR.CLIENTE, se ha creado en el capítulo anterior, debes asegurarte de haber creado la tabla HR.CLIENTE antes de ejecutar los ejemplos de éste capítulo.
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

 

 

 

Tipo de Recurso: