Talk:Matrices Multidimensionales con funciones

From PostgreSQL wiki

Jump to: navigation, search

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

Personal tools