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 <mpanu...@gmail.com> 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" <gerardo.her...@ayres.io> > escribió: > >> >> >> 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 >> >