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

como consulto con una funcion en PL/pgSQL????

Estas en el tema de como consulto con una funcion en PL/pgSQL???? en el foro de PostgreSQL en Foros del Web. Hola a todos!!!! estoy utilizando PostgreSQL 8.1.4 y quiero saber como puedo hacer una función que me devuelva el resultado a una consulta!!! La verdad ...
  #1 (permalink)  
Antiguo 23/05/2006, 13:22
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
Pregunta como consulto con una funcion en PL/pgSQL????

Hola a todos!!!! estoy utilizando PostgreSQL 8.1.4 y quiero saber como puedo hacer una función que me devuelva el resultado a una consulta!!!

La verdad no se nada de PL/pgSQL pero yo tenia algo asi!:

CREATE OR REPLACE FUNCTION probar() RETURNS VOID AS
$$
BEGIN
SELECT * FROM tipo_usuario;
END;
$$
LANGUAGE 'PLPGSQL'

pero eso no me funciona, el objetivo es que me de la respuesta de la consulta que está adentro!!!!

Muchas gracias de antemano a quien me pueda ayudar!!!
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #2 (permalink)  
Antiguo 23/05/2006, 13:51
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
Hola, no se si asi lo sea en PL/pgsql, pero void supuestamente no manda ningún valor. Las funciones mayormente se usan para recibir u obtener un valor especifico.
En tu consulta estas seleccionando todos los campos de la tabla que usas, debes retornar un valor de tu función.
No se que tanto parecido tenga PL/SGSQL con PL/SQL

create function prueba()
Return char as -- depende el tipo de dato que deseas devolver de la función

valor char;
Begin
select campo into valor from tu_tabla;
return valor;
end;

Mas o menos es la lógica en Oracle, imagino que es parecida a lo que usas. Debes especificar el valor a retornar.....
Espero que te ayude en algo, o sino buscare algo al respecto.
Saludos
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #3 (permalink)  
Antiguo 25/05/2006, 12:54
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
Muchas gracias por tu ayuda pero aun no se me resulve el problema!!! bueno por lo menos vota un resultado pero no me vota lo que quiero!!!!

CREATE OR REPLACE FUNCTION probar() RETURNS CHAR AS
$$
DECLARE
valor CHAR;
BEGIN
SELECT * INTO valor FROM tipo_usuario;
RETURN valor;
END;
$$
LANGUAGE 'PLPGSQL'

esta es la función que escribí!!!! y me retorna dos columnias flias = 1 y probar(bpchar) = 1

cuando en realidad me imagino que deberia es retornar es la consulta!!!
Espero me puedas ayudar!!!
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #4 (permalink)  
Antiguo 25/05/2006, 13:40
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
Debes poner un campo especifico en tu consulta:
SELECT campo INTO valor FROM tipo_usuario;

Al poner * estas llamando a todos los campos

Debes ver que el valor que vas a devolver (valor) sea similar (o del mismo tipo de dato) al campo que estas consultando en la BD.
Saludos
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #5 (permalink)  
Antiguo 26/05/2006, 07:50
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
Hola que tal!!
primero que todo gracias por toda la colaboración que me brindas!!!!
y segundo............... será que soy muy bruto o que?????? jajajajajajjajajaj
mira intenté con esto y en cierta medida me dio lo que buscaba

CREATE OR REPLACE FUNCTION probar() RETURNS RECORD AS
$$
DECLARE
valor RECORD;
BEGIN
SELECT * INTO valor FROM tipo_usuario;
RETURN id;
END;
$$
LANGUAGE 'plpgsql'

Me funcionan a medias prorque me salieron primero 1 fila de las 4 que tiene la tabla y me salio dos columnas 1ra columna = 1 y 2da columna = (1,admin,1) y ese es el contenido de la tabla pero solo el priemer registro asi que....... con esta misma sentencia como podria hacer que salieran todos los registros de la tabla sin importar que tan grande sea???

Bien ahora siguiendo tu consejo, hice también lo siguiente

CREATE OR REPLACE FUNCTION probar() RETURNS RECORD AS
$$
DECLARE
id RECORD;
descrip RECORD;
marca RECORD;
BEGIN
SELECT tiu_id INTO id, tiu_descripcion INTO descrip, tip_marca INTO marca FROM tipo_usuario;
RETURN id || descrip || marca;
END;
$$
LANGUAGE 'plpgsql'

RECORD debido a que ya me habia funcionado en lo priemro pero........ esta ves si ni para de lante ni para atras, esta ves si no me sirvio, incluso no graba la función me saca el siguiente error:

ERROR: INTO specified more than once
CONTEXT: compile of PL/pgSQL function "probar" near line 6

Me puedes ayudar con esto porfis???? no será mucha molestia????

De antemano muchas a PequeñoMauro y a todos quellos que me puedan ayudar con este problemilla!!!
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #6 (permalink)  
Antiguo 26/05/2006, 07:55
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
No problem JALF, el problema que tienes es como tienes la parte de INTO

CREATE OR REPLACE FUNCTION probar() RETURNS RECORD AS
$$
DECLARE
id RECORD;
descrip RECORD;
marca RECORD;
BEGIN
SELECT tiu_id , tiu_descripcion,tip_marca
INTO descrip,id,marca
FROM tipo_usuario;
RETURN id || descrip || marca;
END;
$$
LANGUAGE 'plpgsql'

Tienes que especificar los campos en el SELECT, y después haces el INTO y pones las variables que van a recibir los valores por cada campo descrito en el SELECT

SELECT campo1,campo2,campo3 INTO var1,var2,var3
FROM tu_tabla;

Saludos....
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #7 (permalink)  
Antiguo 26/05/2006, 08:02
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
Ahora, por lo que veo tu problema es el siguiente:
La consulta que tu haces te va a mandar 4 registros, pero la variable solo almacenara una fila por que solo te puede mostrar un valor. Por eso te estaba mostrando la primera fila me parece.
Que es lo que deseas hacer esencialmente con la función?, pues si le pones campos a la consulta te va a salir lo mismo que en la primera función que creaste (osea una fila).
Ahora todo depende de como llamas la función, lo llamas desde una consulta?.
Saludos
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #8 (permalink)  
Antiguo 26/05/2006, 08:07
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
Hola de nuevo!!!
hice esto

CREATE OR REPLACE FUNCTION probar() RETURNS RECORD AS
$$
DECLARE
id RECORD;
descrip RECORD;
marca RECORD;
BEGIN
SELECT tiu_id, tiu_descripcion, tip_marca INTO id, descrip, marca FROM tipo_usuario;
RETURN id || descrip || marca;
END;
$$
LANGUAGE 'plpgsql'

Y ahora me saca el siguiente error:

ERROR: RETURN must specify a record or row variable in function returning tuple at or near "|" at character 216

Esto si se puede hacer???
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #9 (permalink)  
Antiguo 26/05/2006, 08:20
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
Ok compañero, empecemos de nuevo:
Cual es el objetivo de la función, es decir, para que la vas a usar?. Dependiendo de eso veremos que se puede hacer.
El error te sale por que (al parecer) no te permite la forma como estas retornando los valores.
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #10 (permalink)  
Antiguo 26/05/2006, 09:55
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
Bueno, a ver te cuento desde el principio!!!!

La cosa es que estoy desarrollando aplicación es en PHP con PostgreSQL porque este servido de DB es completamente gratis tanto a nivel comercial como a nivel personal!!!!

Ahora resulta que cualquier aplicación escrita en PHP es facilmente violada si tengo acceso al archivo de configuración porque ahi se encuentra tanto el usuario como el password de la DB donde va ha hacer sus consultas!!! ¿¿correcto??

Como puede ser violada??? ok es muy sencillo, se sabe que si atacas a una aplicación en PHP de frente, nunca vas a tener exito si esta tiene un nivel de seguiridad alto, ¿¿por que?? porque el servidor te va a responder con una respuesta generada por el script en PHP; ahora ¿¿que pasa si desde otra página cuales quier servidor del mundo llamamos ese archivo con un require o include y luego con una función de PHP mostramos ese codigo?? pues.... BINGO ya tenemos el usuario y el password de la DB y más información de la esperada jijijijijijijijijijiji

Por ahora nunca me ha fallado ese sistema de hackeo, incluso si quiero hackeo forosdelweb.com a no ser que tengan el siguiente sistema de seguridad!!!!!!!

Resulta que en PostgreSQL puedo crear funciones que me hagan lo que yo quiera en la DB o por lo menos eso es lo que he visto.

Entonces porque no crear funciones con consultas ya predestinadas que se que voy a utilizar y luego crear un usuario en la DB que solo pueda ejecutar esas funciones y listo, que el usuario no tenga acceso a las tablas de la DB, ni modificar ni agregar funciones, unicamente puede ejecutar las funciones que yo como administrador le doy y listo!!!! creo que esas son las famosas API

El punto es que ahora en mi aplicativo PHP puedo dejar ese usuario con tranquilidad porque si congen el usuario y el password, se que al entrar a la DB no tendrá accesos sino a las funciones y nada más y ni siquiera las podra modificar ni tampoco podrá agregar, solo las podrá consultar!!!!!!

¿¿que te parece??

Es por eso que quiero aprender a hacer funciones en PL/pgSQL ¿¿ahora si me comprendes??

PD: Digamos que es imposible ver el archivo de configuración en PHP por medio de internet o cualquier red pero..... entonces digamos que en una empresa el administrador del sistema fue atado de pies y manos en el baño y le dieron una golpiza que lo dejo tonto y se sienten a buscar en los arichivos del aplicativo y den con la contraseña que utiliza el aplicativo bancario para accesar a la DB???? aun que den con el si empleo este sistema que propongo pues....... igual quedan en las mismas porque solo tienen acceso a la ejecución de funciones y ya!!!!
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #11 (permalink)  
Antiguo 26/05/2006, 10:09
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
Si ese es el problema, entonces por que no te creas vistas con el tipo de información que quieres que el usuario visualice?.
Recuerda, las funciones retornan un valor, por eso te salia un solo valor en tu función anterior y es por que te retornan valores a partir de los parámetros que tu mandas.
No se, creo que más factible seria que uses vistas, que actuan como tablas, le das permisos a tu usuario que solo consulte las vistas y bueno nada más.
Y lo bueno de las vistas es que, si tu actualizas tu data de tus tablas, la información en la vista tambien se actualiza.
No se es una idea....
Saludos
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #12 (permalink)  
Antiguo 26/05/2006, 10:12
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
VERDAAAAAAAAAAAAAAAAAAAAAAAAADDDDD

Se me habian olvidado las vistas!!!!!!!
JAJAJAJAJAJAJAJAJJA QUE IDIOTA SOY JAJAJAJAJJAJAJAJAJJAJAJAJJAJ

Y yo complicandome la vida por otro lado!!!!!

JAJAJAJJAJAJAJAJJAJJAJAJAJ

Compadre muchas gracias!!!!

Disculpame ahi la perdida de tiempo pero era que no me habia acordado de las vistas!!!!!!!!

JAJAJAJAJAJAJAJAJAJAJAJAJA

Bueno de todas maneras muchas gracias por todo por tu tiempo!!!!!!!!

PD: si llego a necesitar algo de PostgreSQL te puedo volver a consultar????
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #13 (permalink)  
Antiguo 26/05/2006, 10:19
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años
Puntos: 3
De nada compañero. Claro que si, para eso estamos aqui en el foro. Te ayudare en lo que tenga conocimiento, pues yo manejo Oracle, si existe alguna similitud, te ayudare con mucho gusto.
Saludos, buen dia....
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #14 (permalink)  
Antiguo 26/05/2006, 10:31
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 18 años
Puntos: 2
Cita:
Iniciado por JALF
Ahora resulta que cualquier aplicación escrita en PHP es facilmente violada si tengo acceso al archivo de configuración porque ahi se encuentra tanto el usuario como el password de la DB donde va ha hacer sus consultas!!! ¿¿correcto??

Como puede ser violada??? ok es muy sencillo, se sabe que si atacas a una aplicación en PHP de frente, nunca vas a tener exito si esta tiene un nivel de seguiridad alto, ¿¿por que?? porque el servidor te va a responder con una respuesta generada por el script en PHP; ahora ¿¿que pasa si desde otra página cuales quier servidor del mundo llamamos ese archivo con un require o include y luego con una función de PHP mostramos ese codigo?? pues.... BINGO ya tenemos el usuario y el password de la DB y más información de la esperada jijijijijijijijijijiji
¿Como?¿de que archivo de configuración hablas?¿el clásico script php que contine las funciones para conectarse y desconectarse de la base de datos? Aunque incluyas ese script en tu aplicación con require o include, vas a estar incluyendo el resultado de la ejecución de ese script, lo mismo que si pones en el navegador su dirección.
Saludos.
  #15 (permalink)  
Antiguo 26/05/2006, 13:42
Avatar de JALF  
Fecha de Ingreso: septiembre-2004
Ubicación: Cali - Colombia
Mensajes: 634
Antigüedad: 19 años, 7 meses
Puntos: 2
Cita:
Iniciado por Notwen
¿Como?¿de que archivo de configuración hablas?¿el clásico script php que contine las funciones para conectarse y desconectarse de la base de datos? Aunque incluyas ese script en tu aplicación con require o include, vas a estar incluyendo el resultado de la ejecución de ese script, lo mismo que si pones en el navegador su dirección.
Saludos.
voy a revizar como es que lo hago porque se por ahi tengo el script para hacerlo!!!! y lo comparto!!!
__________________
Ubuntu User # 15554
http://dubaiphp.wordpress.com/ -Mi vida de desarrollo, juegos y algo más en un Blog-
  #16 (permalink)  
Antiguo 21/12/2007, 13:53
 
Fecha de Ingreso: octubre-2006
Mensajes: 2
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: como consulto con una funcion en PL/pgSQL????

Cita:
Iniciado por JALF Ver Mensaje
voy a revizar como es que lo hago porque se por ahi tengo el script para hacerlo!!!! y lo comparto!!!


Es imposible realizar un include o require desde un servidor a otro, solo es posible con rutas relativas o absolutas, pero fisicas

por ejemplo

include(/users/pepito/http/miapp/miarchivo.php)

es imposible poner include("http://www.miweb.com/miarchivo.php");

con suerte podras conectarte con sockets a esa pagina, pero solo podras leer lo que la pagina te muestre, y como el contenido de los archivos de configuracion son solo variables y nunca se realizar un echo o print en esos archivos y mucho menos conteniendo las variables de usser y pass, esta practica es imposible.

Y no me vengan con que el tio de mi amigo tiene un hijo que es tiene de novia al amigo de un amigo al cual es el sobrino de kevin mitnick que le pego ladillas y por eso supo como hacerlo.

Imposible, la unica forma de leer desde afuera del server el codigo fiuente de un php es que este con una extension no legible por ejemplo el server solo toma a los .php como un script y al php3 como texto plano y por casualidad el webmaster dejo un php3 ahi con los datos de configuracion.

PD: llegue a este post buscando info sobre postgis, tengo una funcion que toma un grupo de poligonos, pero desde php no podia retornar datos, pero era una estupides mia, me habia faltado un echo jejej

Última edición por tokugawa; 21/12/2007 a las 14:06
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

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 04:21.