PostgreSQL - ¿Cómo hacer para que una función me devuelva dos campos de una tabla después de un Insert?

   
Vista:
Imágen de perfil de Alcahez

¿Cómo hacer para que una función me devuelva dos campos de una tabla después de un Insert?

Publicado por Alcahez (2 intervenciones) el 07/03/2018 01:55:38
Hola, espero estén bien.

La cuestión es que un amigo y yo queremos hacernos de una tienda de reparación de equipos y para bajar los costos de inicio yo me estoy encargando de hacer un programa y la base de datos para llevar el registro de todo lo que se haría en la tienda (reparación, ventas, salidas, etc).

Hice una función que me puede guardar o actualizar datos en una tabla al mismo tiempo, según sea el caso. El problema es que tengo un campo que se llama "N_Boleta" de tipo Serial y otro "Fecha_Ingreso" de tipo timestamp without time zone DEFAULT now() en la tabla, de los cuales necesito saber su valor después de hacer un INSERT INTO.

No quiero hacer un SELECT para buscar el último registro ya que no hay seguridad que otra persona no guarde nuevos datos justo después. Traté de usar RETURNING, pero no entiendo cómo hacer para que me devuelva 2 columnas, solo he podido con una.


Esta es la tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE "Taller" (
    "N_Boleta" Serial,
    "Id_Cliente" Int,
    "Info_Equipo" Varchar (500) Not Null,
    "Problema" Varchar (500) Not Null,
    "Fecha_Ingreso" timestamp without time zone DEFAULT now() Not Null,
    "Id_Recibe" Smallint Not Null,
    "Revisando" Boolean DEFAULT False,
    "Diagnostico" Varchar (1000),
    CONSTRAINT "PK_Taller" PRIMARY KEY ("N_Boleta", "Id_Cliente"),
    CONSTRAINT "Id_Cliente" FOREIGN KEY ("Id_Cliente") REFERENCES "Clientes" ("Id_Cliente") Match Simple On Update No Action On Delete No Action,
    CONSTRAINT "Id_Recibe" FOREIGN KEY ("Id_Recibe") REFERENCES "Usuarios" ("Id_Usuario") Match Simple On Update No Action On Delete No Action
);



Y esta es la función:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
CREATE OR REPLACE FUNCTION "Guardar_Boleta" (vN_Boleta Int, vInfo_Equipo Varchar (500), vProblema Varchar (500), vRecibe Varchar (20), vRevisando Boolean, vDiagnostico Varchar (1000),
                                             vNombre Varchar (40), vCompania Varchar (40), vTel1 Varchar (9), vTel2 Varchar (9), vEmail Varchar (40)) RETURNS TABLE(boleta int, fecha date) AS $$
 
DECLARE
    vFechaHora timestamp without time zone;
 
BEGIN
 
----------------------------------------------------------------------
-- PARTE DE LA FUNCIÓN QUE NO VIENE AL CASO
----------------------------------------------------------------------
 
 
	-- Actualizar o guardar nuevos datos en la tabla Taller.
    IF vN_Boleta = 0 THEN
    	INSERT INTO "Taller" ("N_Boleta", "Id_Cliente", "Info_Equipo", "Problema", "Fecha_Ingreso", "Id_Recibe")
        VALUES (Default,
                (SELECT "Id_Cliente" FROM "Clientes" WHERE "Nombre" = vNombre),
                vInfo_Equipo,
                vProblema,
                now(),
                (SELECT "Id_Usuario" FROM "Usuarios" WHERE "Nombre" = vRecibe))
        RETURNING "N_Boleta", "Fecha_Ingreso" INTO vN_Boleta, vFechaHora;
 
    ELSE
    	UPDATE "Taller"
        SET "N_Boleta" = vN_Boleta,
    		"Id_Cliente" = (SELECT "Id_Cliente" FROM "Clientes" WHERE "Nombre" = vNombre),
    		"Info_Equipo" = vInfo_Equipo,
    		"Problema" = vProblema,
        	"Id_Recibe" = (SELECT "Id_Usuario" FROM "Usuarios" WHERE "Nombre" = vRecibe),
    		"Revisando" = vRevisando,
    		"Diagnostico" = vDiagnostico
        WHERE "N_Boleta" = vN_Boleta;
    END IF;
 
    RETURN;
 
END;
$$
Language plpgsql;


¿Qué ocupo?: Que me devuelva los campos "N_Boleta" y "Fecha_Ingreso" después de un INSERT INTO.

Muchas gracias por tomarse un tiempo para contestarme.
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

¿Cómo hacer para que una función me devuelva dos campos de una tabla después de un Insert?

Publicado por martin (100 intervenciones) el 07/03/2018 18:49:26
RETURN QUERY SELECT "vN_Boleta", "vFechaHora"; o las variables que quieras retornar, siempre con el mismo tipo, forzar un CAST si es necesario.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alcahez

¿Cómo hacer para que una función me devuelva dos campos de una tabla después de un Insert?

Publicado por Alcahez (2 intervenciones) el 08/03/2018 05:51:07
Hola @martin

Muchas gracias por tu respuesta, eso era exactamente lo que ocupaba . +1

Ya pueden cerrar este tema.

Saludos.


NOTAS:
1- Me hice una vista con solo los campos que ocupo para pasarla como tipo de dato de retorno de la función "Guardar_Boleta", para que no me dé problemas en los tipos de columnas y para que quede más ordenado.

2- Cuando hacía la consulta el resultado de los dos datos se me mostraba en una sola columna, hasta que me dí cuenta que tenía que cambiar el SELECT que llamaba a a la función, ejemplo:

Como yo lo hacía (mostraba todo en una sola columna):
1
SELECT "Guardar_Boleta" (0, 'Prueba33', Problema1, ...);


Como lo corregí para que aparezcan los datos en dos o más columnas como debe de ser:
1
SELECT * FROM "Guardar_Boleta" (0, 'Prueba33', Problema1, ...);
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