Saltar al contenido

Función de Postgres que devuelve la tabla que no devuelve datos en columnas

Agradecemos tu apoyo para difundir nuestros escritos acerca de las ciencias de la computación.

Solución:

Para obtener columnas individuales en lugar del tipo de fila, llame a la función con:

SELECT * FROM testfunction();

Al igual que seleccionaría todas las columnas de una tabla.
Considere también esta forma revisada de su función de prueba:

CREATE OR REPLACE FUNCTION testfunction()
  RETURNS TABLE(a int, b int)
  LANGUAGE plpgsql AS
$func$
DECLARE
   _a int := 0;
   _b int := 0;
BEGIN
   CREATE TEMP TABLE tbl AS SELECT _a, _b;
   RETURN QUERY SELECT * FROM tbl;
   DROP TABLE tempTable;
END
$func$;

En particular:

  • DECLARE key la palabra solo se necesita una vez.
  • Evite declarar parámetros que ya están (implícitamente) declarados como OUT parámetros en el RETURNS TABLE (...) cláusula.
  • No utilice identificadores de casos CaMeL sin comillas en Postgres. Funciona, los identificadores sin comillas se escriben en minúsculas, pero puede generar errores confusos. Ver:
    • ¿Los nombres de las columnas de PostgreSQL distinguen entre mayúsculas y minúsculas?

La tabla temporal es completamente inútil en el ejemplo (probablemente simplificada en exceso). Podrías reducir a:

CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int)
  LANGUAGE plpgsql AS
$func$
BEGIN
   a := 0;
   b := 0;
END
$func$;

Por supuesto que puedes hacer esto poniendo la llamada de función en el FROM cláusula, como Eric Brandstetter respondió correctamente. Sin embargo, esto a veces se complica en una consulta que ya tiene otras cosas en la cláusula FROM. Para obtener las columnas individuales que devuelve la función, puede usar esta sintaxis:

SELECT (testfunction()).*

O para obtener solo la columna llamada “a”:

SELECT (testfunction()).a

Coloque la función completa, incluidos los valores de entrada entre paréntesis, seguida de un punto y el nombre de la columna deseada, o un asterisco.

Para obtener los nombres de las columnas que devuelve la función, tendrá que:

  • revisa el código fuente
  • primero inspeccione el resultado de la función, así: SELECT * FROM testfunction() .

Los valores de entrada todavía pueden salir de un FROM cláusula. Solo para ilustrar esto, considere esta función y pruebe los datos:

CREATE FUNCTION funky(a integer, b integer)
RETURNS TABLE(x double precision, y double precision) AS $$
 SELECT a*random(), b*random();
$$ LANGUAGE SQL;

CREATE TABLE mytable(a integer, b integer);
INSERT INTO mytable
    SELECT generate_series(1,100), generate_series(101,200);

Podrías llamar a la función “funky(a,b)”, sin necesidad de ponerla en el FROM cláusula:

SELECT (funky(mytable.a, mytable.b)).*
FROM mytable;

Lo que resultaría en 2 columnas:

         x         |         y         
-------------------+-------------------
 0.202419687062502 |   55.417385618668
  1.97231830470264 |  63.3628275180236
  1.89781916560605 |  1.98870931006968
(...)

Aquí tienes las reseñas y valoraciones

Si sostienes algún reparo y capacidad de acrecentar nuestro división eres capaz de realizar una crónica y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *