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

PROBLEMON!!!! con funcion

Estas en el tema de PROBLEMON!!!! con funcion en el foro de PostgreSQL en Foros del Web. Buen dia a todos. tengo un problemon bien grande, miren basicmante este es el problema que tengo tengo una funcion la cual tiene una variable ...
  #1 (permalink)  
Antiguo 28/04/2010, 14:57
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 2 meses
Puntos: 0
PROBLEMON!!!! con funcion

Buen dia a todos.
tengo un problemon bien grande, miren basicmante este es el problema que tengo

tengo una funcion la cual tiene una variable que se llama cuery, esta variable cuery tiene como su pronunciacion lo dice una cadena de texto pero eso es un cuery

para ejmplificar mas o pmenos esto es lo que haria la funcion si regresara la variable


CREATE OR REPLACE FUNCTION arbol() RETURN text AS $$
DECLARE

cuery text:='';
BEGIN

funcion.........
cuery:='select * from .......................................' ;


return cuery;
end;
$$



Ahora que es lo que quiero y no he podido hacer, en la misma funcion
despues de cuery:='select from ...........................'

create view ruta as cuery;
y no me da
create view ruta as execute cuery;


tambien he probado usando la funcion como argumento (si es que se le llama asi)
recordando que la funcion regresa el cuery
pongo esto y aun asi no funciona



create view ruta as select arbol();
o tabien pongo
create view ruta as execute arbol();
y nada de nada!!!!
espero me puedan ayudar.
  #2 (permalink)  
Antiguo 28/04/2010, 19:09
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: PROBLEMON!!!! con funcion

Toda operación DDL,DML o DCL dentro de una función en plpgsql debe ser ejecutada mediante execute.

execute 'create view ruta as consulta';

Pero creo que te complicas la vida calakra. Vas a hacer una vista cada que corraas la función? Eso no parece para nada optimo.

Si esta es una solución para el problema que postraste hace poco de como retornar una consulta, eso es algo que se puede hacer con return next en la versión 8.2 de postgresql.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 28/04/2010, 23:13
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: PROBLEMON!!!! con funcion

Gracias, pero lo que pasa me has mandando respuestas muy buenas, que de hecho investigo y trato de probar, digo soy nuevo, pero tambien leo y trato de aplicar.
por otro lado como te había comentado. mira para ser mas explicito y no errarle al explicar si uso el return next se debe llamar a la funcion de esta forma

create function prueba().....
DECLARE
tabla record;
...
...
BEGIN
FOR tabla IN SELECT id,name,last_name FROM usuario LOOP
RETURN NEXT tabla;
END LOOP;
....
...
END;


aqui lo llamarias de esta forma

SELECT * FROM prueba() AS f(a varchar,d varchar,c varchar);

aquí es fácil llamar a la función debido a que tu sabes cuantas columnas te va a regresar que en este caso son tres.

pero en mi funcion genero un query la cual tiene 'n' columnas, ya que es dinamica
mira, es muy parecido al árbol que te había enseñado antes del arbol.
digamos que en la empresa solo estas tu y otro chavo el cual es tu empleado, el resultado seria algo asi

Código HTML:
<table>
<tr><td>NIVEL1</td><td>NIVEL2              </td><td>ID</td></tr>
<tr><td>huesos</td><td>------                  </td><td>00</td></tr>
<tr><td>huesos</td><td>chavodelhuesos</td><td>01</td></tr>
</table> 

ahi esta facil saber cuantas columnas regresas, pero digamos que la empresa crece y hay mas de 300 empleados y algunos van de baja y otros van de alta, pues cada empleado tiene un nivel hay quienes te contesten a ti y hay quienes contesten al tu chavo y hay quienes contesten a tu chavo aumentando los niveles a algo asi.

Código HTML:
<table>
<tr><td>NIVEL1</td><td>     NIVEL2          </td><td>NIVEL3        </td><td>NIVEL4        </td><td>ID</td></tr>
<tr><td>huesos</td><td>     ------          </td><td>-----         </td><td>-----         </td><td>00</td></tr>
<tr><td>huesos</td><td>chavodelhuesos       </td><td>empleadonuevo </td><td>------        </td><td>02</td></tr>
<tr><td>huesos</td><td>chavodelhuesos       </td><td>empleadonuevo2</td><td>-----        </td><td>04</td></tr>
<tr><td>huesos</td><td>chavodelhuesos       </td><td>empleadonuevo2</td><td>otro          </td><td>03</td></tr>
<tr><td>huesos</td><td>chavodelhuesos       </td><td>------------- </td><td>-----        </td><td>01</td></tr>
</table> 
mira, ahora digamos que la empresa crese y tu sigues siendo jefe y sigue tu chavo, pero ahora a tu chavo le responden dos personas (empleadonuevo y empleadonuevo2) pero a empleadovuevos2 le responde otra persona (otro), si te das cuenta es dinamica y si agregas a otra persona que responda a la persona "otro" se tendria que agregar un nivel.
espero que con esto quede claro del por que el RETURN NEXT es mas complicado (o eso pienso).

De verdad que si se te ocurre algo mas facil dimela!!!! Como lo comente soy algo nuevo y de verdad agradesco tu ayuda. como tambien te habia comentado, no puedo agregar una tabla nueva y tampoco puedo agregar mas campos y lo debo de hacer con postgresql. espero ahora quede mas claro mi problema.

ahora por ultimo

lo que me dijiste quedaria asi?
EXECUTE 'CREATE VIEW arbol AS'||cuery;

sabiendo que el la variable cuery trae toda la cadena del query?
  #4 (permalink)  
Antiguo 20/05/2010, 07:33
 
Fecha de Ingreso: mayo-2010
Mensajes: 12
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: PROBLEMON!!!! con funcion

Hola calakra, creo que lo que tu necesitas es crear un TYPE para que esa funcion te retorne un resultado en forma de query, tendrias que hacer algo asi:

Código:
CREATE OR REPLACE FUNCTION mi_funcion (parametro1, parametro2)
  RETURNS SETOF mi_tipo  AS

$BODY$
DECLARE ...............
Luego crearte un tipo, investiga en este link

[URL="http://www.postgresql.org/docs/8.4/static/sql-createtype.html"]enlace...[/URL]

Y luego te tienes que crear un tipo llamado mi_tipo asociado a la funcion

Etiquetas: funcion
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 18:08.