Re: Crear Una trigger usando ROW_NUMBER

2018-02-23 Thread Guillermo E. Villanueva
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

2018-02-21 Thread Miguel Panuera
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

2018-02-21 Thread Gerardo Herzig
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