El 21 de febrero de 2018, 11:25, yeli <yeliar...@gmail.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