El tema es que tengo par de funciones que utilizan cursores y son ejecutadas desde PHP, el códifgo utilizado desde PHP es el sigueinte:
function _execute_sql_cursor($query){ $sql = db_query($query); db_query('COMMIT'); return $sql; } donde query puede ser algo como esto: $query = "BEGIN; SELECT * from miFuncion('w'); FETCH ALL IN w;"; Obtengo el resultado del cursor en la variable $sql, y despues hago commit. Pero me estaba sucediendo, que como utilizo pgpool-II, la primera parte se jecutaba en un nodo y el commit en otro, generando un error, que para postgres es un warning. En algún momento llegué a pensar que necesitaba reimplementar las funciones, y ahí la duda entre cursores y parametros OUT en cuanto a rendimiento, pero investigando encontré que al parecer esto era un bug, que había sido resuelto, instalé la nueva verión de pgpool-II y al parecer el problema se resolvió. De todos modos, muchisimas gracias por tu ayuda, porque al final, lo que más vale es el nuevo conocimiento que uno va adquirirendo. Nuevamente, gracias. Saludos a todos. ________________________________________ From: Alvaro Herrera [alvhe...@alvh.no-ip.org] Sent: Thursday, July 05, 2012 10:12 AM To: Lazáro Rubén García Martínez Cc: Ayuda Subject: RE: [pgsql-es-ayuda] Duda entre refcursor y record Excerpts from lgarciam's message of jue jul 05 09:47:46 -0400 2012: > Alvaro muchas gracias por tu respusta, ahora te pregunto, si en vez de > retornar los valores de la consulta utilizando un For Loop, lo hago > utilizando un RETURN QUERY obtendría alguna ventaja, o sucedería lo mismo que > si realizo un For Loop, me refiero a si con esta otra via también hay que > crear un tuplestore con el resultado. (El tuplestore es la variable que se > recorre en el ciclo no??) No estoy seguro pero me parece que es exactamente lo mismo, porque ppgsql sólo opera de esa forma. (Un tuplestore es un almacén de tuplas. Recibe todas las tuplas del ciclo o la consulta completa, y cuando la función termina, el tuplestore se lee tupla por tupla para retornar el resultado). ¿Qué es lo que quieres optimizar? Porque la diferencia en tiempo entre una cosa (refcursor) y la otra (variables OUT) debe ser minúscula. Cuando usas refcursor también hay un tuplestore: el refcursor se guarda en el tuplestore, y tu código debe abrir el tuplestore, leer el resultado, y luego al recibir el FETCH empezarás a leer tuplas desde el plan de ejecución. Nota que hay que hacer un FETCH, en cambio en la otra solución lees los registros directamente. Toda esa complejidad extra me hace pensar que no hay por donde perderse. -- Álvaro Herrera <alvhe...@alvh.no-ip.org> Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU! http://www.antiterroristas.cu http://justiciaparaloscinco.wordpress.com Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU! http://www.antiterroristas.cu http://justiciaparaloscinco.wordpress.com - 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