Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Consulta de funciones (stored procedures)

Estas en el tema de Consulta de funciones (stored procedures) en el foro de PostgreSQL en Foros del Web. Hola buen dia, actualmente me encuentro migrando de SQL Server a PostgreSQL en la version 9.2. Mi problema es el siguiente, dentro de la base ...
  #1 (permalink)  
Antiguo 11/12/2012, 13:16
 
Fecha de Ingreso: abril-2009
Mensajes: 10
Antigüedad: 15 años
Puntos: 0
Pregunta Consulta de funciones (stored procedures)

Hola buen dia, actualmente me encuentro migrando de SQL Server a PostgreSQL en la version 9.2.

Mi problema es el siguiente, dentro de la base de datos que estoy migrando existen varios (bastantes) Stored Procedures y la mayoria regresan varios sets de resultados, un ejemplo de esto es:

Código:
CREATE PROCEDURE [dbo].[SP_ONS_SIC_S_DATOS_ACTAS]

AS
BEGIN

SELECT CARRERA, DESCRIPCION FROM CARRERAS

SELECT DISTINCT PLAN_ESTUD, NOMBRE_PLAN FROM PLANES_ESTUDIO 

SELECT DISTINCT ESPECIALIDAD, DESCRIPCION FROM ESPECIALIDADES 

END
Este Stored me responde 3 sets diferentes de informacion, si los vemos como si fueran tablas serian 3 tablas diferentes de dos columnas cada una.

Ahora bien la pregunta, es posible hacer esto mismo en PostgreSQL? y de ser posible podrian orientarme al respecto, hasta el momento he logrado crear los Stored sin embargo no he logrado que me regresen mas de un set de datos.

Espero puedan ayudarme gracias
  #2 (permalink)  
Antiguo 11/12/2012, 13:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta de funciones (stored procedures)

Mira la clausula RETURN QUERY.

te puede ayudar.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 11/12/2012, 14:59
 
Fecha de Ingreso: abril-2009
Mensajes: 10
Antigüedad: 15 años
Puntos: 0
Respuesta: Consulta de funciones (stored procedures)

Hola de nuevo, gracias a la ayuda encontre esto:

Código:
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF dbo.planes_estudio
AS $$
BEGIN

RETURN QUERY
SELECT carrera FROM dbo.planes_estudio;

RETURN QUERY
SELECT carrera FROM dbo.carreras;

END;
$$  language plpgsql;
Sin embargo al ejecutar la funcion me devuelve lo siguiente:

Código:
ERROR:  structure of query does not match function result type
DETAIL:  Number of returned columns (1) does not match expected column count (11).
CONTEXT:  PL/pgSQL function "test" line 3 at RETURN QUERY


********** Error **********

ERROR: structure of query does not match function result type
El tipo de dato y la longitud son la misma, es un dato varchar con longitud de 1, sin embargo creo que el problema radica en la diferencia de columnas entre ambas tablas, lo cual me complicaria despues las cosas ya que las diferentes tablas que llego a utilizar son muy diferentes entre si y solo comparten el tipo de dato de uno o dos campos.

Tambien encontre Return Table y la funcion quedo asi:

Código:
CREATE OR REPLACE FUNCTION tabla()
RETURNS TABLE(carrera text, descripcion text) 
AS $$
BEGIN
RETURN QUERY
    SELECT carrera, descripcion from dbo.carreras;

RETURN QUERY
    SELECT plan_estud, nombre_plan from dbo.planes_estudio;
END; 
$$ LANGUAGE PLPGSQL;
Sin embargo el resultado sigue siendo el mismo:

Código:
ERROR:  structure of query does not match function result type
DETAIL:  Returned type character varying(2) does not match expected type text in column 1.
CONTEXT:  PL/pgSQL function "tabla" line 5 at RETURN QUERY

********** Error **********

ERROR: structure of query does not match function result type
SQL state: 42804
Alguna sugerencia?
  #4 (permalink)  
Antiguo 23/12/2012, 21:41
 
Fecha de Ingreso: abril-2009
Mensajes: 10
Antigüedad: 15 años
Puntos: 0
Respuesta: Consulta de funciones (stored procedures)

Hola de nuevo, despues de algunas fiestas navideñas y mas trabajo pendiente por fin pude crear la funcion que me devolviera varios sets de datos, es un poco diferente a lo que Huesos52 me habia explicado pero el resultado es el que necesito, el codigo quedo asi:

Código:
CREATE OR REPLACE FUNCTION datos_generales()
  RETURNS SETOF refcursor AS
$BODY$
DECLARE
carrerasRC refcursor;
especialidadesRC refcursor;
planesRC refcursor;
BEGIN
open carrerasRC FOR
SELECT * FROM dbo.carreras;
RETURN NEXT carrerasRC;

open especialidadesRC FOR
SELECT * FROM dbo.especialidades;
RETURN NEXT especialidadesRC;

open planesRC FOR
SELECT * FROM dbo.planes_estudio;
RETURN NEXT planesRC;

RETURN;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
Un detalle importante a considerar es que si esta funcion se ejecuta desde pgAdmin regresara una columna con 3 filas que dicen <unnamed portal 1>

Sin embargo cuando se ejecuta desde C# (que es lo unico que he comprobado hasta el momento) el programa muestra correctamente los datos solicitados.

En esta pagina se encuentra una explicacion mas detallada de la situacion:

[URL]http://www.sqlines.com/postgresql/how-to/return_result_set_from_stored_procedure[/URL]

Con esto daria por cerrado este tema, nuevamente Gracias Huesos, la idea que me diste me oriento bastante
  #5 (permalink)  
Antiguo 25/12/2012, 14:48
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Consulta de funciones (stored procedures)

Ten cuidado con el manejo de cursores.
Espero los estes cerrando de igual forma desde c#.

de lo contrario en poco tiempo tendrás problemas en tu base de datos por cursores abiertos.
saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: funciones, sql-server
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:11.