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 elRETURNS 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.