Para PostgreSQL, podría hacer algo como esto:
CREATE OR REPLACE FUNCTION fnExplode(in_array anyarray) RETURNS SETOF ANYELEMENT AS
$$
SELECT ($1)[s] FROM generate_series(1,array_upper($1, 1)) AS s;
$$
LANGUAGE SQL IMMUTABLE;
Entonces, usted podría pasar una cadena delimitada a su procedimiento almacenado.
Say, param1 era un parámetro de entrada que contiene '1|2|3|4|5'
La declaración:
SELECT CAST(fnExplode(string_to_array(param1, '|')) AS INTEGER);
da como resultado un conjunto de resultados que se pueden unir o insertados.
Del mismo modo, para MySQL, que podría hacer algo como esto:
DELIMITER $$
CREATE PROCEDURE `spTest_Array`
(
v_id_arr TEXT
)
BEGIN
DECLARE v_cur_position INT;
DECLARE v_remainder TEXT;
DECLARE v_cur_string VARCHAR(255);
CREATE TEMPORARY TABLE tmp_test
(
id INT
) ENGINE=MEMORY;
SET v_remainder = v_id_arr;
SET v_cur_position = 1;
WHILE CHAR_LENGTH(v_remainder) > 0 AND v_cur_position > 0 DO
SET v_cur_position = INSTR(v_remainder, '|');
IF v_cur_position = 0 THEN
SET v_cur_string = v_remainder;
ELSE
SET v_cur_string = LEFT(v_remainder, v_cur_position - 1);
END IF;
IF TRIM(v_cur_string) != '' THEN
INSERT INTO tmp_test
(id)
VALUES
(v_cur_string);
END IF;
SET v_remainder = SUBSTRING(v_remainder, v_cur_position + 1);
END WHILE;
SELECT
id
FROM
tmp_test;
DROP TEMPORARY TABLE tmp_test;
END
$$
A continuación, sólo tiene que llamar spTest_Array('1|2|3|4|5')
debe producir el mismo resultado en forma de la consulta PostgreSQL anteriormente.
Comenzando con SQL Server 2008, puede utilizar variables de tabla como parámetros de procedimiento almacenados. – Thorarin