Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/10/2009, 09:13
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 3 meses
Puntos: 360
Respuesta: Problema con Store Procedure en PostgreSQL

2 cosas jgabrielsinner10

1. Cuando utilizas una función con language 'sql', No es posible realizar sentencias for ni procedimientos de programación. Por eso es recomendable hacer uso de language 'plpgsql'.
2. Para retornar un record es necesario especificar los campos que se mostraran en la tabla que quieres ejecutar al momento de ejecutarla.

te dejo un ejemplo.

Código sql:
Ver original
  1. pruebas=> \d sueldos
  2.               Tabla ½public.sueldos╗
  3.       Columna      |     Tipo     | Modificadores
  4. -------------------+--------------+---------------
  5.  id                | INTEGER      |
  6.  categoria         | text         |
  7.  unidad_tributaria | NUMERIC(6,2) |
  8.  
  9. pruebas=> \d sueldos1
  10.                      Tabla ½public.sueldos1╗
  11.       Columna      |            Tipo             | Modificadores
  12. -------------------+-----------------------------+---------------
  13.  id                | INTEGER                     |
  14.  categoria         | text                        |
  15.  unidad_tributaria | text                        |
  16.  id_peti           | INTEGER                     |
  17.  fecha             | TIMESTAMP WITHOUT TIME zone | DEFAULT now()
  18.  tipo_servicio     | text                        |
  19.  factracion        | text                        |
  20.  
  21. pruebas=> CREATE OR REPLACE FUNCTION consulta(text) RETURNS setof record
  22. pruebas-> AS
  23. pruebas-> $body$
  24. pruebas$> DECLARE
  25. pruebas$> registro record;
  26. pruebas$> SQL text;
  27. pruebas$> BEGIN
  28. pruebas$> SQL = 'select *from ' || $1;
  29. pruebas$> FOR registro IN EXECUTE SQL
  30. pruebas$> loop
  31. pruebas$> RETURN NEXT registro;
  32. pruebas$> END loop;
  33. pruebas$> RETURN;
  34. pruebas$> END;
  35. pruebas$> $body$ LANGUAGE 'plpgsql' VOLATILE;
  36. CREATE FUNCTION
  37. pruebas=> SELECT *FROM consulta('sueldos') AS t(a INTEGER, b text, c NUMERIC);
  38.  a | b |  c
  39. ---+---+------
  40.  6 | B | 1.12
  41.  3 | A | 1.00
  42.  7 | C | 1.37
  43.  6 | B | 1.12
  44.  3 | A | 1.00
  45.  7 | C | 1.37
  46. (6 filas)
  47.  
  48. pruebas=> SELECT *FROM consulta('sueldos1') AS t(a INTEGER, b text, c text, d INTEGER, e TIMESTAMP,f text, g text);
  49.  a | b |  c   | d  |            e            |      f       |     g
  50. ---+---+------+----+-------------------------+--------------+-----------
  51.  6 | B | 1.12 | 20 | 2009-03-16 11:26:57.453 | sin facturar | seleccion
  52.  3 | A | 1.00 | 20 | 2009-03-16 11:26:57.453 | sin facturar | seleccion
  53.  7 | C | 1.37 | 20 | 2009-03-16 11:26:57.453 | sin facturar | seleccion
  54.  6 | B | 1.12 | 20 | 2009-03-16 11:26:57.453 | sin facturar | seleccion
  55.  3 | A | 1.00 | 20 | 2009-03-16 11:26:57.453 | sin facturar | seleccion
  56.  7 | C | 1.37 | 20 | 2009-03-16 11:26:57.453 | sin facturar | seleccion
  57.  8 | A | 1    | 18 | 2009-03-27 08:22:44.953 | facturado    | seleccion
  58. (7 filas)

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming