Re: Crear Una trigger usando ROW_NUMBER
La consulta con ventanas para obtener el row_number no es correcta, devuelve una tabla y debería devolver un valor escalar. Sugerencias, cambiale el nombre a la columna row_number por ejemplo fila podes obtener la última fila con ... ... select coalesce(max(fila),0) into var_fila from tabla where cod_cent=new.cod_cent; new.fila := var_fila + 1; return new ... ... El 21 de febrero de 2018, 12:10, Miguel Panuera escribió: > Quieres crear un correlativo por cent? Y que rownumber sea un campo en > tu tabla?? > > El 21 feb. 2018 9:51 a. m., "Gerardo Herzig" > escribió: > >> >> >> El 21 de febrero de 2018, 11:25, yeli 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 >> >
Re: Crear Una trigger usando ROW_NUMBER
Quieres crear un correlativo por cent? Y que rownumber sea un campo en tu tabla?? El 21 feb. 2018 9:51 a. m., "Gerardo Herzig" escribió: > > > El 21 de febrero de 2018, 11:25, yeli 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 >
Re: Crear Una trigger usando ROW_NUMBER
El 21 de febrero de 2018, 11:25, yeli 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