sql - Postgres函数返回表不返回列中的数据

标签 sql postgresql plpgsql postgresql-9.1

我有一个返回表的 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 block 在提取数据时出现问题。从此函数返回表时,如何获取行和列中的数据?换句话说:为什么 PL/pgSQL 函数不以列的形式返回数据?

最佳答案

要获取单个列而不是行类型,请调用函数:

SELECT * FROM testfunction();

就像您从表格中选择所有列一样。
还要考虑这种经过审查的测试功能形式:

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

特别是:

DECLARE 关键字只需要一次。

避免在 RETURNS TABLE (...) 子句中声明已经(隐式)声明为 OUT 参数的参数。

不要在 Postgres 中使用不带引号的 CaMeL 大小写标识符。它有效,未加引号的标识符被转换为小写,但它会导致混淆错误。见:

示例中的临时表完全没有用(可能过于简化)。给出的示例归结为:

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

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

相关文章:

php - Codeigniter 在 SQL 查询中使用 LIKE 和 WHERE

c# - 如何在 SQL 查询中包含数组的所有元素?

postgresql - ec2实例重启后无法启动postgresql

SQL - 聚合函数不能在 postgresql 中嵌套错误

sql - Big Query SQL - 对所有可能的聚合级别进行分组

sql - SQL SERVER 2005 中基于函数的索引

sql - 为什么我的 pg_hint_plan 前导提示没有被使用?

function - 错误 : query has no destination for result data while using a cursor

postgresql - Postgres如何评估从查询到函数中变量的表达式

postgresql - plgpsql - 是否可以声明 setof 记录或表变量?