如何从 PostgreSQL 中的另一个函数调用 table 函数?
How to call table function from another function in PostgreSQL?
我是 PostgreSQL 新手。
我有一个功能
CREATE OR REPLACE FUNCTION func1 ( a_person_id integer) RETURNS TABLE (granted_group_id varchar(10)) AS $body$
WITH v_granted_group_list AS (
SELECT DISTINCT a.group_id
FROM a_table a
)
SELECT v.group_id FROM v_granted_group_list v;
$body$
LANGUAGE sql;
我想在其他函数中使用它的输出 func2
。
我尝试按照以下代码执行此操作,但出现错误。
我们可以用什么来代替 v_access_groups
数组?
CREATE OR REPLACE FUNCTION func2 ( a_person_id IN integer,mhrc_emp_no IN varchar(50))
RETURNS TABLE (granted_group_id varchar(10)) AS $body$
DECLARE
v_access_groups varchar[];
BEGIN
v_access_groups := func1(a_person_id);
---- this gives error
---ERROR: malformed array literal: "LCCHG"
----DETAIL: Array value must start with "{" or dimension information.
--------CONTEXT: PL/pgSQL function func2(integer,character varying) line 14 at SQL statement
-- what can we you in place of v_access_groups array
RETURN v_access_groups;
END;
$body$
LANGUAGE PLPGSQL;
我想在 select 查询的另一个函数中使用 func2
的结果
CREATE OR REPLACE FUNCTION func3 ( a_blurb_id integer, a_person_id integer,mhrc_emp_no varchar(20)) RETURNS boolean AS $body$
DECLARE
v_acc_count numeric;
v_accessAllowed boolean:=FALSE;
BEGIN
SELECT COUNT(*) INTO v_acc_count
FROM table1 agfa
where agfa.group_id IN (
SELECT TO_CHAR(column_value) AS group_id
FROM TABLE(func2(a_person_id,mhrc_emp_no))
);
RETURN TRUE;
END;
$body$
LANGUAGE PLPGSQL;
如何在 PostgreSQL 中实现这一点?
您可以像往常一样 table 引用函数 returning table。例如,您函数 func1
return 列 varchar(10)
。没有你的结构,我将使用 generate_series
。所以 lateral join
@murison 所关心的是:
t=# select pg_class.oid
from pg_class
join lateral generate_series(11700,11711,1) g on pg_class.oid = g
;
oid
-------
11701
11704
11707
11711
(4 rows)
这里我得到 oid 介于 11700 和 11711 之间,因为我的 generate_series
将 return 值:11700、11701、11702 等等,直到 11711...
您想要的 IN
运算符的解决方案也非常简单:
t=# select oid from pg_class
where oid IN (select generate_series(11700,11711,1));
oid
-------
11701
11704
11707
11711
(4 rows)
所以不需要将 func1
的结果除以 func2
中的数组。
您可以像使用 table.
一样在查询中使用集合返回函数(table 函数)
因此,要将结果分配给名为 v_access_groups
的 text[]
,您可以按如下方式进行:
SELECT array_agg(granted_group_id) INTO v_access_groups FROM func1(a_person_id);
但是您的 func2
应该只包含:
RETURN QUERY SELECT * FROM func1(a_person_id);
如果您省略 TABLE(...)
表达式,您的 func3
应该可以工作 – 只需将函数视为 table,无需额外的语法。
我是 PostgreSQL 新手。
我有一个功能
CREATE OR REPLACE FUNCTION func1 ( a_person_id integer) RETURNS TABLE (granted_group_id varchar(10)) AS $body$
WITH v_granted_group_list AS (
SELECT DISTINCT a.group_id
FROM a_table a
)
SELECT v.group_id FROM v_granted_group_list v;
$body$
LANGUAGE sql;
我想在其他函数中使用它的输出 func2
。
我尝试按照以下代码执行此操作,但出现错误。
我们可以用什么来代替 v_access_groups
数组?
CREATE OR REPLACE FUNCTION func2 ( a_person_id IN integer,mhrc_emp_no IN varchar(50))
RETURNS TABLE (granted_group_id varchar(10)) AS $body$
DECLARE
v_access_groups varchar[];
BEGIN
v_access_groups := func1(a_person_id);
---- this gives error
---ERROR: malformed array literal: "LCCHG"
----DETAIL: Array value must start with "{" or dimension information.
--------CONTEXT: PL/pgSQL function func2(integer,character varying) line 14 at SQL statement
-- what can we you in place of v_access_groups array
RETURN v_access_groups;
END;
$body$
LANGUAGE PLPGSQL;
我想在 select 查询的另一个函数中使用 func2
的结果
CREATE OR REPLACE FUNCTION func3 ( a_blurb_id integer, a_person_id integer,mhrc_emp_no varchar(20)) RETURNS boolean AS $body$
DECLARE
v_acc_count numeric;
v_accessAllowed boolean:=FALSE;
BEGIN
SELECT COUNT(*) INTO v_acc_count
FROM table1 agfa
where agfa.group_id IN (
SELECT TO_CHAR(column_value) AS group_id
FROM TABLE(func2(a_person_id,mhrc_emp_no))
);
RETURN TRUE;
END;
$body$
LANGUAGE PLPGSQL;
如何在 PostgreSQL 中实现这一点?
您可以像往常一样 table 引用函数 returning table。例如,您函数 func1
return 列 varchar(10)
。没有你的结构,我将使用 generate_series
。所以 lateral join
@murison 所关心的是:
t=# select pg_class.oid
from pg_class
join lateral generate_series(11700,11711,1) g on pg_class.oid = g
;
oid
-------
11701
11704
11707
11711
(4 rows)
这里我得到 oid 介于 11700 和 11711 之间,因为我的 generate_series
将 return 值:11700、11701、11702 等等,直到 11711...
您想要的 IN
运算符的解决方案也非常简单:
t=# select oid from pg_class
where oid IN (select generate_series(11700,11711,1));
oid
-------
11701
11704
11707
11711
(4 rows)
所以不需要将 func1
的结果除以 func2
中的数组。
您可以像使用 table.
一样在查询中使用集合返回函数(table 函数)因此,要将结果分配给名为 v_access_groups
的 text[]
,您可以按如下方式进行:
SELECT array_agg(granted_group_id) INTO v_access_groups FROM func1(a_person_id);
但是您的 func2
应该只包含:
RETURN QUERY SELECT * FROM func1(a_person_id);
如果您省略 TABLE(...)
表达式,您的 func3
应该可以工作 – 只需将函数视为 table,无需额外的语法。