@educasitas

viernes, 11 de septiembre de 2009

Oracle: Procedure con array

Durante estos últimos días he estado liado con un proceso de Oracle que recibiera como entrada (entre otras cosas) un array de parámetros. Y el tema no fue tan sencillo como pensaba porque requiso aprender nuevos conceptos (por lo menos para mí que son un newbie en esto del PL/SQL).

Básicamente, lo que necesitaba es crear un proceso que recibiera una lista indefinida de valores (a veces 3, a veces, 4, a veces 20) para guardarlo en una tabla.

En Java (mi mundo) existe la opción de utilizar Varargs pero en Oracle, la verdad es que estaba un poco perdido.

Así que un poquito de googling para sacar alguna conclusión interesante como que Oracle no soporta tipos array (¿?) y para poder utilizarlo debemos definirnos nuestro nuevo tipo:

CREATE OR REPLACE TYPE value_array AS TABLE OF VARCHAR2 (100);


Una vez definido este tipo de datos, podemos utilizarlo para crear una procedure que lo use como entrada. Por ejemplo:
CREATE OR REPLACE PROCEDURE sample_using_arrays (tx_values IN value_array) AS
-- Variables Internas
error_desc   VARCHAR (1023);
BEGIN
FOR i IN 1 .. tx_values.COUNT
LOOP
INSERT INTO sample_table (value)  VALUES (tx_values (i));
END LOOP;

EXCEPTION
WHEN OTHERS
THEN
error_desc := SUBSTR (SQLERRM, 1, 1023);
DBMS_OUTPUT.put_line ('Error: ' || error_desc);
END;


Con esto ya tendremos definido el tipo de datos y un procedure que lo utilice como dato de entrada.

Finalmente, para realizar una prueba ejecutaríamos el siguiente código:

DECLARE     
tx_values value_array := value_array ('Valor 1', 'Valor 2', 'Valor 3');   
BEGIN     
sample_using_arrays (tx_values);   
END;



Y con esto, ya tenemos nuestra primera prueba de concepto para llevarlo a cabo. Algo enrevesado, pero funciona perfectamente. ¿Sabéis algun otro modo (mejor) de llevarlo a cabo?

3 comentarios: