我有一个Postgres函数,它返回一个表:

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS
$BODY$
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
BEGIN
CREATE TABLE tempTable AS SELECT a, b;
RETURN QUERY SELECT * FROM tempTable;
DROP TABLE tempTable;
END;
$BODY$
LANGUAGE plpgsql;

此函数不以行和列的形式返回数据。相反,它将数据返回为:
(0,0)

这导致Coldfusion cfquery块在提取数据时出现问题。从该函数返回表时,如何获取行和列中的数据?换句话说:为什么PL/pgSQL函数不以列的形式返回数据?

最佳答案

要获取单个列而不是行类型,请使用以下命令调用函数:

SELECT * FROM testfunction();

就像从表中选择所有列一样。
还可以考虑您的测试函数的这种经过评审的形式:
CREATE OR REPLACE FUNCTION testfunction()
  RETURNS TABLE(a int, b int) 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$  LANGUAGE plpgsql;

特别地:
DECLARE关键字只需要一次。
避免在OUT子句中声明已经(隐式)声明为RETURNS TABLE (...)参数的参数。
不要在Postgres中使用不带引号的CaMeL大小写标识符。它可以工作,未引用的标识符转换为小写,但它会导致混淆错误。见
Are PostgreSQL column names case-sensitive?
临时表在示例中完全没有用处(可能过于简化)。你可以减少到:
CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS
$func$
BEGIN
   a := 0;
   b := 0;
END
$func$  LANGUAGE plpgsql;

关于sql - Postgres函数返回表不返回列中的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14628771/

10-12 00:41
查看更多