Tuesday, May 20, 2008

Re: [pgsql-es-ayuda] Fwd: Saludos desde Mexico

> A ver si entiendo:
> Si (SELECT nombtabla from __aaatipos WHERE idt = 1) es "tabla1",
> quieres hacer un
> Select * from tabla1??
> Si es así, no es posible hacerlo en SQL. ...

> Depende de que lenguaje de programacion estes usando :
> Yo lo pondria asi :
> cTabla_recuperada = SELECT nombtabla from __aaatipos WHERE idt = 1
> SELECT * FROM &cTabla AS &cTabla;
> Lo mas recomendable en todo caso podria ser pasar el nombre de la tabla a
> una variable y de alli evaluar la variable.


Por eso yo dije "no es posible hacerlo EN SQL". Tú lo haces desde una
aplicación externa usando algún lenguaje (de programación) diferente
al SQL.

También se puede hacer en PL/pgSQL:
create or replace function obtendatos(tabla text)
returns setof record
language plpgsql
as $$
declare c refcursor;
r record;
begin
open c for execute 'select * from '|| quote_ident(tabla);
fetch c into r;
while found loop
return next r;
fetch c into r;
end loop;
return;
end;
$$;

Pero lo malo de esta opción es que tendría que conocer a priori el
esquema de la tabla que va a consultar, porque como se ve da un error
si no se indica.
penabad=> select * from obtendatos('tabla1');
ERROR: se requiere una lista de definición de columnas para funciones
que retornan «record»

En cambio, si sí se indica, funciona:
penabad=> select * from obtendatos('tabla2') as y(a int, b int);
a | b
---+---
1 | 1
2 | 2
(2 filas)

Para terminar, habría otra opción: una función que devuelve un cursor
abierto, pero sólo para ser usado en transacciones:
Primero creamos la función:
CREATE OR REPLACE FUNCTION micursor(tabla text)
RETURNS refcursor
LANGUAGE plpgsql
AS
$$
DECLARE
C REFCURSOR;
BEGIN
open c FOR EXECUTE 'select * from '|| quote_ident(tabla);
RETURN c;
END
$$;

Y luego la usamos:
penabad=> begin;
BEGIN
penabad=> select micursor('tabla2');
micursor
--------------------
<unnamed portal 6>
(1 fila)

penabad=> fetch all in "<unnamed portal 6>";
campo1 | campo2
--------+--------
1 | 1
2 | 2
(2 filas)

penabad=> commit;


Saludos
--
Miguel Rodríguez Penabad
--
TIP 7: no olvides aumentar la configuración del "free space map"

No comments: