Gracias Alvaro. Me sirvió el create temp table.. SaludosMauricio
El Miércoles 23 de septiembre de 2015 17:01, Alvaro Herrera <alvhe...@2ndquadrant.com> escribió: mauricio pullabuestan escribió: > Buen día > > Necesito crear una función que recibe 2 string con formato json,al compilar > me da el error "temporary" is not a known variable. > El código es el siguiente: > CREATE OR REPLACE FUNCTION prb.listado_fn(In w_cab_json varchar, In > w_det_json varchar)RETURNS TABLE (tarea NUMERIC, operacion VARCHAR, > observacion VARCHAR, centro VARCHAR, proceso VARCHAR, dpto VARCHAR, > seccion VARCHAR, articulo VARCHAR, unidad VARCHAR)AS$BODY$ BEGIN > DROP TABLE IF EXISTS tarifa_rs; > With tAS (Select j.tarea, j.operacion, j.observacion, j.ms_oper, j.mo_tasa, > j.gf_porcentaje, j.gf_tasa, sum(j.ms_oper) over (PARTITION BY j.tarea) > as ms_tar, CASE j.un When 'Uno' Then 1 When 'Cien' Then 100 When 'Mil' > Then 1000 END :: NUMERIC(4, 0) As factorFrom > json_populate_recordset(null::prb.tarifa_detalle_type, w_det_json) j)Select > t.tarea, t.operacion, t.observacion, t.ms_oper, t.mo_tasa, t.gf_porcentaje, > t.gf_tasa, t.ms_tar, row_number() Over(PARTITION By t.tarea ORDER BY > t.operacion desc) As rn, Round( (((t.mo_tasa /60) * (t.ms_tar / > t.factor)) + ((((t.mo_tasa /60) * (t.ms_tar / t.factor)) * (t.gf_porcentaje / > 100)) + t.gf_tasa)), 3) As costo_total INTO TEMPORARY tarifa_rsFrom t; > Update tarifa_rs Set ms_tar = 0, costo_total = 0 Where tarifa_rs.rn > 1; > RETURN Query Select d.tarea, d.operacion, d.observacion, d.centro, d.proceso, > c.dpto, c.seccion, c.articulo, c.unidad From tarifa_rs d CROSS JOIN (Select > *From json_populate_record(null::prb.tarifa_cabecera_type, w_cab_json::json)) > cORDER BY d.tarea, d.operacion; > DROP TABLE IF EXISTS tarifa_rs; > END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; > Cuando corro el código sin crear la función, todo funciona bien, crea la > tabla temporal y me devuelve los resultados que espero, pero si intento hacer > la funcion tengo el error, si comento INTO TEMPORARY tarifa_rs compila sin > problemas Hola, el problema es que SELECT INTO en plpgsql no es lo mismo que SELECT INTO en SQL. En plpgsql, INTO indica almacenar el resultado de la consulta en una variable, mientras que en SQL indica crear una tabla. Son dos cosas totalmente diferentes. Creo que deberías poder solucionar tu problema usando CREATE TEMP TABLE AS en vez de tratar de usar SELECT INTO. Lo otro es que en realidad no necesitas una tabla temporal para esto. Puedes hacer simplemente "RETURN QUERY WITH t AS ..." y te olvidas del DROP TABLE IF EXISTS. -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda