DALL·E 2024 03 13 16.22.10 Imagine a 1024x1024 pixels illustration that showcases the differences and similarities between IN OUT and INOUT parameters in Oracle and PostgreSQL

IN, OUT, INOUT Oracle VS PostgreSQL

Cuando se trabaja con bases de datos, a menudo es necesario realizar operaciones que incluyen almacenar y recuperar información.

Para llevar a cabo estas tareas, muchas veces se utilizan procedimientos almacenados y funciones. Es ahí donde entran en juego los parámetros.

En este artículo, vamos a comparar los parámetros IN, OUT y INOUT en Oracle y PostgreSQL, dos de las bases de datos más utilizadas en la actualidad.

¿Qué son los parámetros?

Los parámetros son variables que se utilizan para pasar valores a una función o procedimiento almacenado.

Estos valores pueden ser constantes o variables, y suelen ser utilizados para realizar cálculos o para filtrar datos en una consulta.

Pasar por valor VS Pasar por referencia

Antes de avanzar con los IN, OUT, e INOUT debemos familiarizarnos con los términos de «pasar por valor» y «pasar por referencia«.

Cuando pasamos por valor nos referimos a que el parámetro es una copia del valor, mientras que cuando pasamos por referencia nos referimos a pasar la referencia de memoria real de la variable o parámetro.

Los métodos utilizados por Oracle y PostgreSQL para pasar y procesar parámetros de rutina varían.

Debemos comprender el funcionamiento interno y las distinciones entre Oracle y PostgreSQL para escribir o migrar código de manera efectiva.

¿Qué es un parámetro IN?

Un parámetro IN es aquel que se utiliza para pasar un valor a una función o procedimiento almacenado.

Este valor no puede ser modificado dentro de la función o procedimiento almacenado. Es decir, es un valor de solo lectura.

¿Qué es un parámetro OUT?

Un parámetro OUT es aquel que se utiliza para devolver valores de procedimientos almacenados al entorno de llamada.

A diferencia de los parámetros IN, no se proporciona un valor para los parámetros OUT cuando se llama al procedimiento.

En su lugar, el procedimiento asigna valores a los parámetros OUT durante su ejecución, y puedes recuperar esos valores después de que el procedimiento haya finalizado.

¿Qué es un parámetro INOUT?

Un parámetro INOUT es aquel que se utiliza para pasar un valor a una función o procedimiento almacenado y para devolver un valor desde la misma.

Este valor puede ser modificado dentro de la función o procedimiento almacenado.

En otras palabras, los parámetros INOUT combinan los comportamientos de los parámetros IN y OUT.

Se utilizan para pasar valores iniciales a un procedimiento o función y luego obtener valores potencialmente modificados.

Cómo pasa Oracle los parámetros IN, OUT e INOUT

Por defecto, Oracle pasa los parámetros OUT e INOUT por valor y los IN por referencia.

Sí, ha leído bien. Cuando se cambia un parámetro OUT o IN OUT dentro de un procedimiento, sólo cambia una copia del valor del parámetro.

El valor resultante se copia de nuevo en el parámetro formal sólo después de que el procedimiento haya finalizado sin errores.

Si envías una colección como parámetro OUT o IN OUT, se pasará por valor. Esto significa que la colección completa se copiará del parámetro formal al parámetro real al entrar en el procedimiento y se copiará de nuevo al parámetro formal al salir de él.

Si la colección es enorme, esto puede consumir mucha CPU y Memoria. Podemos resolver este problema de consumo con el hint NOCOPY, indicando al motor de ejecución que intente pasar los argumentos OUT o IN OUT por referencia en lugar de por valor.

Como pasa PostgreSQL los parámetros IN, OUT, e INOUT

PostgreSQL no admite el paso de parámetros por referencia; en su lugar, sólo admite el paso por valor.

No se pasa ninguna referencia cuando se utiliza un parámetro OUT o INOUT, pero los valores devueltos se toman del resultado compuesto.

Comparación de parámetros en Oracle y PostgreSQL

Como hemos visto, en Oracle se pueden definir los 3 tipos de parámetros dentro de un procedimiento:

CREATE OR REPLACE PROCEDURE demo_proc(
    p_in IN NUMBER,            -- IN
    p_out OUT NUMBER,          -- OUT
    p_inout IN OUT NUMBER      -- INOUT
) AS
BEGIN
    p_out := p_in * 2;         -- Editamos parámetro OUT
    p_inout := p_inout + 10;   -- Editamos parámetro INOUT
END;
/

Si quisiéramos llamar a este procedimiento de ejemplo sería tan fácil como:

DECLARE
    v_out NUMBER;
    v_inout NUMBER := 5;
BEGIN
    demo_proc(3, v_out, v_inout);
    DBMS_OUTPUT.PUT_LINE('OUT: ' || v_out);
    DBMS_OUTPUT.PUT_LINE('INOUT: ' || v_inout);
END;
/

En cambio, en PostgreSQL tenemos que usar funciones para conseguir esta misma funcionalidad.

Como no podemos usar IN, OUT e INOUT implícitamente al declarar las variables (como en Oracle), el propio Postrgres las infiere de la definición de la función y de su llamada.

No obstante, las funciones en PostgreSQL sí que pueden devolver múltiples valores usando el parámetro OUT o devolviendo un registro o conjunto de registros:

CREATE OR REPLACE FUNCTION demo_func(p_in INTEGER, INOUT p_inout INTEGER, OUT p_out INTEGER)
AS $$
BEGIN
    p_out := p_in * 2;        -- OUT parameter
    p_inout := p_inout + 10;  -- Editamos el INOUT
END;
$$ LANGUAGE plpgsql;

Y llamaríamos a la función así:

SELECT * FROM demo_func(3, 5);

En resumen, la diferencia principal radica en el enfoque sintáctico y en el hecho de que Oracle utiliza procedimientos y funciones dentro de paquetes para encapsular la lógica de la base de datos, mientras que PostgreSQL utiliza principalmente funciones (o procedimientos en versiones más recientes) que pueden devolver múltiples formatos, incluidos conjuntos de registros, lo que resulta más flexible en términos de manipulación y recuperación de datos.

Conclusión

Oracle pasa parámetros IN por referencia y parámetros OUT e INOUT por valor. PostgreSQL no admite el paso por referencia; en su lugar, todos los parámetros se pasan por valor.

Como PostgreSQL solo soporta paso por valor, y solo una entidad debe salir de la función, las funciones con ambos argumentos OUT/INOUT y variable de retorno no son soportadas. En este caso esa única entidad de retorno de la función es especificada únicamente por el valor de los parámetros OUT/INOUT.

Sólo se utilizan los valores de los argumentos OUT/INOUT para proporcionar la entidad de retorno única de la función. La cláusula RETURNS aquí es opcional, y la sentencia RETURN sólo se utiliza para terminar la ejecución, no especifica el valor devuelto.

Si queremos convertir una función Oracle con ambos parámetros, variable de retorno y OUT/INOUT, a PostgreSQL entonces necesitamos hacer la variable de retorno también un parámetro OUT en PostgreSQL y cambiar el tipo de datos de retorno a RECORD o eliminar la cláusula RETURNS completamente.

Únete a la lista de emails para no perderte nada

No tengo ningún producto, publicidad, ni nada que venderte. De hecho, aún no tengo nada que hacer con estos emails. Pero si te interesa estar en contacto o no perderte las próximas actualizaciones en el futuro… Ya sabes 😉

    ¿Quieres trabajar con nosotros?

    Ya sea que necesites mejorar el rendimiento de consultas existentes, planificar y ejecutar migraciones de datos críticas, diseñar bases de datos desde cero o mantener un entorno de base de datos estable, estamos aquí para ayudarte.

    Trabajamos con una amplia variedad de sistemas de gestión de bases de datos (DBMS) y estamos comprometidos en proporcionar soluciones adaptadas a tus necesidades específicas. Puedes consultar nuestra lista completa de servicios aquí.

    Confía en nosotros para optimizar tus bases de datos y liberar tiempo y recursos para que puedas concentrarte en lo que realmente importa: hacer crecer tu negocio.

    ¡Contáctanos hoy mismo y descubre cómo podemos ayudarte a lograr un rendimiento óptimo en tu entorno de bases de datos!


    Comentarios

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *