Sat*_*rma 11 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;
Run Code Online (Sandbox Code Playgroud)
此函数不以行和列形式返回数据.相反,它返回数据为:
(0,0)
Run Code Online (Sandbox Code Playgroud)
这导致Coldfusion cfquery块在提取数据时出现问题.从此函数返回表时,如何获取行和列中的数据?换句话说:为什么PL/pgSQL函数不会将数据作为列返回?
Erw*_*ter 20
要获取单个列而不是行类型,请使用以下命令调用该函数:
SELECT * FROM testfunction();
Run Code Online (Sandbox Code Playgroud)
就像你从表中选择所有列一样.
还要考虑这个评估的测试功能形式:
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;
Run Code Online (Sandbox Code Playgroud)
特别是:
DECLARE 关键词只需要一次.OUT参数的参数RETURNS TABLE (...).临时表在示例中完全没用(可能过度简化).你可以减少到:
CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS
$func$
BEGIN
a := 0;
b := 0;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
当然,您可以通过将函数调用放在FROM子句中来做到这一点,就像 Eric Brandstetter 正确回答的那样。然而,对于 FROM 子句中已有其他内容的查询来说,这有时会变得复杂。要获取函数返回的各个列,您可以使用以下语法:
SELECT (testfunction()).*
Run Code Online (Sandbox Code Playgroud)
或者只获取名为“a”的列:
SELECT (testfunction()).a
Run Code Online (Sandbox Code Playgroud)
将整个函数(包括输入值)放在括号中,后跟一个点和所需的列名称或星号。
要获取函数返回的列名称,您必须:
SELECT * FROM testfunction():输入值仍然可以来自子句FROM。为了说明这一点,考虑这个函数和测试数据:
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);
Run Code Online (Sandbox Code Playgroud)
您可以调用函数“funky(a,b)”,而不需要将其放在子句中FROM:
SELECT (funky(mytable.a, mytable.b)).*
FROM mytable;
Run Code Online (Sandbox Code Playgroud)
这会产生 2 列:
x | y
-------------------+-------------------
0.202419687062502 | 55.417385618668
1.97231830470264 | 63.3628275180236
1.89781916560605 | 1.98870931006968
(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8362 次 |
| 最近记录: |