当函数返回a TABLE或a时SETOF composite-type,如此示例函数:
CREATE FUNCTION func(n int) returns table(i int, j bigint) as $$
BEGIN
RETURN QUERY select 1,n::bigint
union all select 2,n*n::bigint
union all select 3,n*n*n::bigint;
END
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
结果可以通过各种方法访问:
1)select * from func(3)将产生这些输出列:
i | j ---+--- 1 | 3 2 | 9 3 | 27
2)select func(3)将只生成一个ROW类型的输出列.
func ------- (1,3) (2,9) (3,27)
3)select (func(3)).*会产生#1:
i | j ---+--- 1 | 3 2 | 9 3 | …
我有一个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函数不会将数据作为列返回?
假设我们有两个表:
CREATE TABLE element (
pk1 BIGINT NOT NULL,
pk2 BIGINT NOT NULL,
pk3 BIGINT NOT NULL,
-- other columns ...
PRIMARY KEY (pk1, pk2, pk3)
);
CREATE TYPE element_pk_t AS (
pk1 BIGINT,
pk2 BIGINT,
pk3 BIGINT
);
CREATE TABLE collection (
id BIGINT,
elements element_pk_t[] NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)
具有element复合PK。自定义类型element_pk_t注册匹配的复合类型。该collection表包含数组element_pk_t。
我想在单个查询中查询表中elementPK 与 selected 中的元素匹配的所有行。collection.elements
我尝试过的:
SELECT *
FROM element
WHERE (pk1, pk2, pk3) IN (SELECT unnest(elements)
FROM collection …Run Code Online (Sandbox Code Playgroud)