Talk:Matrices Multidimensionales con funciones
From PostgreSQL wiki
Saludos a todos,
Las propuestas para crear matrices dinámicas son buenas, algunas no funcionan correctamente. Se presentan errores al asignar valores a las matrices.
La declaración de una matriz es similar como se realiza en el lenguaje C. Al declarar una matriz de tipo TYPE[][] no es suficiente, hay que separar espacio de memoria primero para las columnas y luego para cada fila. El problema surge cuando queramos definir un tamaño variable de columnas. Esto se soluciona usando la combinación de comando ARRAY(SELECT value FROM generate_serie(1,n)), donde value es un valor de inicialización (normalmente cero) y n es el indicador columnas. La función "generate_series" permite generar tantos registro como lo indique n. La instrucción ARRAY() permite coger los valores de la consulta y forma una arreglo con los valores de esta.
(Solución creada por Edgard Medina Q.)
-- Esta función permite Crear una matriz de MxN e inicializada con un valor (por defecto es cero) CREATE OR REPLACE FUNCTION New_Matrix( pn_Rows INTEGER, -- Número de Filas de la matriz pn_Cols INTEGER, -- Numero de Columna de la matriz pn_Value INTEGER = 0) -- Valor de inizialización de la matriz RETURNS INTEGER[][] AS $$ DECLARE Arreglo INTEGER[] := ARRAY( SELECT pn_Value FROM generate_series(1, pn_Cols) ) ; -- Arreglo de N elementos (columnas), inizializadas con el valor de "value" Matriz INTEGER[][] := ARRAY[ Arreglo ] ; -- Inicializamos la primera fila, con el Arreglo de N columnas. BEGIN FOR idx IN 2..pn_Rows LOOP -- Se iniziliza el resto de las M-1 filas de la matriz Matriz := array_cat( Matriz, Arreglo ) ; -- Concatenamos el arreglo a la matriz (añade una fila a la matriz). END LOOP ; RETURN Matriz ; END; $$ LANGUAGE plpgsql ;
Comprobamos el funcionamiento con esta función:
CREATE OR REPLACE FUNCTION test_matrix( pn_Rows INTEGER) RETURNS TABLE(col_1 INTEGER, col_2 INTEGER, col_3 INTEGER) AS $$ DECLARE vn_Cols INTEGER := 3 ; -- matrix columns number matrix INTEGER[][] := New_Matrix(pn_Rows, vn_Cols) ; -- Declaramos la matriz e inicializamos. BEGIN FOR i IN 1..pn_Rows LOOP FOR j IN 1..vn_Cols LOOP matrix[i][j] := i * j ; -- Asignamos valores a la matriz y no envia errores END LOOP; END LOOP; RETURN QUERY SELECT matrix[r][1], matrix[r][2], matrix[r][3] FROM generate_series(1, pn_Rows) g(r) ; END; $$ LANGUAGE plpgsql ;
Ejecutamos la función:
SELECT * FROM test_matrix(5) ; -- Comprobación de la función 'test_matrix()'.
El Resultado de la consulta es:
col_1 col_2 col_3 ------- ------- ------- 1 2 3 2 4 6 3 6 9 4 8 12 5 10 15 (5 rows proccess)
Espero que esto aclare dudas de como declarar y utilizar una matriz de MxN
