From: | Gerardo Herzig <gerardo(dot)herzig(at)ayres(dot)io> |
---|---|
To: | yeli <yeliarias(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)lists(dot)postgresql(dot)org |
Subject: | Re: Crear Una trigger usando ROW_NUMBER |
Date: | 2018-02-21 14:50:55 |
Message-ID: | CAM+tAYG9a1XqoUxhFGKRTr80pxnXjY53xa3=OGHdAFwTHq-mLw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El 21 de febrero de 2018, 11:25, yeli <yeliarias(at)gmail(dot)com> escribió:
> Buen día, estoy intento crear un código único concatenado tomando datos de
> la función ROW_NUMBER debería hacer lo siguiente:
>
> Tengo una base de datos postgresql que contiene datos geográficos para ser
> visualizados en un software GIS.
>
> Básicamente es una tabla donde se guardan datos sobre centros poblados,
> estos centros poblados tienen datos que al concatenarlos se intenta crear
> códigos únicos.
>
> id(serial)
>
> Ccentpob
>
> (Primary Key)
>
> Nombre
>
> (Character)
>
> cod_cent
>
> (Fk_Key)
>
> sim_cent
>
> (Fk_Key)
>
> row_number
>
> (Integer)
>
> 1
>
>
> La Guaira
>
> 24
>
> VAR
>
>
> 2
>
>
> Maiquetía
>
> 24
>
> VAR
>
>
> 3
>
>
> Cabudare
>
> 13
>
> LAR
>
>
> 4
>
>
> Barquisimeto
>
> 13
>
> LAR
>
>
> 5
>
>
> Maracay
>
> 05
>
> ARA
>
>
> 6
>
>
> Palo Negro
>
> 05
>
> ARA
>
>
>
>
> Utilizando una consulta con la función ROW_NUMBER, logro numerar de cada
> Centro Poblado en función a la entidad federal que pertenecen:
>
> SELECT Id,ccentpob,nombre,cod_cent,sim_cent, ROW_NUMBER ( ) OVER
> (PARTITION BY cent)
>
> la cual me permite, llevar una secuencia de los datos en función a sus
> diferentes entidades federales centros poblados. Por lo que esta consulta
> queda así:
>
>
> id(serial)
>
> Ccentpob
>
> (Primary Key)
>
> Nombre
>
> (Character)
>
> cod_cent
>
> (Fk_Key)
>
> sim_cent
>
> (Fk_Key)
>
> row_number
>
> (Integer)
>
> 1
>
>
> La Guaira
>
> 24
>
> VAR
>
> 1
>
> 2
>
>
> Maiquetía
>
> 24
>
> VAR
>
> 2
>
> 3
>
>
> Cabudare
>
> 13
>
> LAR
>
> 1
>
> 4
>
>
> Barquisimeto
>
> 13
>
> LAR
>
> 2
>
> 5
>
>
> Los Crepusculos
>
> 13
>
> LAR
>
> 3
>
> 6
>
>
> Palo Negro
>
> 05
>
> ARA
>
> 1
>
>
>
> Hasta aquí todo funciona perfecto. Al probar esto como una consulta
> intento ponerlo en un función que permita utilizar un trigger, que se va a
> activar cada que que al insertar un dato desde el SIG, se enumere el dato
> siguiendo la secuencia. Lo que me va a permita concatenar los datos para
> crear el ccentpob que es el único dato que me falta.
>
> La función que utilizo es la siguiente:
>
>
> CREATE TRIGGER row_number BEFORE INSERT
>
> ON nombres_geograficos.ba_2202_100101_n_vargas_centros_poblados
>
> FOR EACH ROW EXECUTE PROCEDURE nombres_geograficos.row_number();
>
>
> CREATE OR REPLACE FUNCTION nombres_geograficos.row_number() RETURNS
> TRIGGER AS '
>
> DECLARE
>
> row_number numeric;
>
> BEGIN
>
> IF NEW.cent IS NOT NULL THEN
>
> row_number := (SELECT ROW_NUMBER ( ) OVER (PARTITION BY cent)
>
> FROM nombres_geograficos.ba_2202_100101_n_vargas_centros_poblados);
>
> END IF;
>
> RETURN NEW;
>
> END'
>
> language PLPGSQL;
>
>
> Compilo todo y no me da error, pero cuando intento usar el Qgis 2.18 me da
> un error… y no me almacena el dato. Dice que el dato no esta almacenado,
> estoy consiente que el ROW_NUMBER es un dato temporal, sea parte de la
> tabla para así poder ejecutar mi trigger con éxito.
>
> Alguien tiene alguna sugerencia.
>
> Se lo agradecería de verdad.
>
>
>
>
>
>
Si entendi bien, en el trigger necesitas asignar new.row_number a algo:
IF NEW.cent IS NOT NULL THEN
row_number := (SELECT ROW_NUMBER ( ) OVER (PARTITION BY cent)
FROM nombres_geograficos.ba_2202_100101_n_vargas_centros_poblados);
new.row_number = row_number;
END IF;
O algo asi......usar row_number como variable, nombre de campo, y siendo
que es ya una funcion en postgres, resulta bastante confuso y no creo que
se la mejor idea usarlo asi.
HTH
--
--
Gerardo Herzig
Principal Consultant at Ayres Data Team
root at Via Postgres Argentina
From | Date | Subject | |
---|---|---|---|
Next Message | Miguel Panuera | 2018-02-21 15:10:08 | Re: Crear Una trigger usando ROW_NUMBER |
Previous Message | yeli | 2018-02-21 14:25:47 | Crear Una trigger usando ROW_NUMBER |