PostgreSQL - Procedimiento almacenado para retornar el ultimo registro ingresado

 
Vista:
sin imagen de perfil

Procedimiento almacenado para retornar el ultimo registro ingresado

Publicado por Alexander (4 intervenciones) el 12/06/2017 22:51:01
Saludos amigos estoy haciendo una funcion para retornar el registro ingresado, no el ultimo porque puede darse el caso que esten ingresando al mismo momento varios usuarios y se pueden cruzar los registros, la idea es de utilizar returning pero me da error alguien me puede ayudar


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE OR REPLACE FUNCTION sch_recursos_humanos.spenrolarguardar(
    IN p_id_funcionario integer,
    IN p_id_regimen integer,
    IN p_id_cargo integer,
    IN p_descripcion character varying,
    IN p_detalle character varying,
    IN p_observacion character varying,
    IN p_usuario_app integer)
  RETURNS SETOF RECORD AS
$BODY$
	DECLARE
    v_numero_enrolados INT DEFAULT 0;
    v_mes INT DEFAULT 0;
    v_ano INT DEFAULT 0;
    ins RECORD;
		BEGIN
		v_mes =  date_part('month',now());
    v_ano =  date_part('years',now());
    SELECT COUNT(*) INTO v_numero_enrolados FROM sch_recursos_humanos.enrolar;
    WITH ins AS (
      INSERT INTO sch_recursos_humanos.enrolar (id_funcionario, id_regimen, id_cargo, numero_enrolado, codigo_enrolado, descripcion, detalle, observacion, usuario_app)
  		VALUES(p_id_funcionario, p_id_regimen, p_id_cargo, v_numero_enrolados, v_numero_enrolados + 1 || '.' || p_id_funcionario || '.' || p_id_regimen || '.' || p_id_cargo || '.' || v_mes || '.' || v_ano  , p_descripcion, p_detalle, p_observacion, p_usuario_app)
      RETURNING *
    )
      RETURN SELECT * FROM ins;
	END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 16
Ha aumentado 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

Procedimiento almacenado para retornar el ultimo registro ingresado

Publicado por Yamil Bracho (7 intervenciones) el 12/06/2017 23:25:04
Lo mejor es que utilizes un sequence para generar la secuencia de numeros que llevara ese campo o delcaras el campo como SERIAL.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Procedimiento almacenado para retornar el ultimo registro ingresado

Publicado por Alexander Gonzalez (4 intervenciones) el 13/06/2017 00:58:59
Si hago eso el problema sigue siendo el mismo porque al momento de ingresar varios datos l mismo tiempo cuando haga la consulta posiblemente s todos les llegue el ultimo registro sigue siendo el misml problena igual
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Procedimiento almacenado para retornar el ultimo registro ingresado

Publicado por martin (121 intervenciones) el 14/06/2017 20:34:04
1- Con un serial no hay chance de que se produzca una colisión, es su finalidad,y de eso se encarga el motor de base de datos, en el insert no tenes que pasar esa columna.
2- te recomiento crear una sp cuyo valor de retorno es setof sch_recursos_humanos.enrolar, es decir la estructura de la tabla donde insertaste y la cual veo que queres retornar(RETURN QUERY) y no un record.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Procedimiento almacenado para retornar el ultimo registro ingresado

Publicado por Alexander González (4 intervenciones) el 14/06/2017 20:42:43
Saludos martin gracias por la ayuda, claro con serial nunca se producirá una colisión, pero ese no es el inconveniente, supongamos que se ingresan 500 registros a más al mismo tiempo siempre se generará el un serial diferente eso está bién, el problema es que necesito que me retorne el registro que ingresé, porque si ingresan muchos registros al mismo tiempo, si hago la consulta con el ultimo registro ingresado a todos los usuarios se les va cruzar los datos de los todos los registros ingresados suponagmos que son 500 o más registros ingresados
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Procedimiento almacenado para retornar el ultimo registro ingresado

Publicado por martin (121 intervenciones) el 15/06/2017 17:46:34
Si, ya te di la solucion RETURN QUERY INSERT INTO ... VALUES.. RETURNING *;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar