2017-08-02 132 views
2

我是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; 

我想使用的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中實現這一目標?

+0

使用橫向連接 – murison

+0

@mursion我是新來的postgres。怎麼能做到這一點? –

回答

1

您可以像查詢表一樣使用查詢中的返回函數(表函數)。

所以分配結果的text[]名爲v_access_groups,你可以進行如下操作:

SELECT array_agg(granted_group_id) INTO v_access_groups FROM func1(a_person_id); 

但你func2應該只包含:

RETURN QUERY SELECT * FROM func1(a_person_id); 

如果省略你func3應該工作TABLE(...)表達式–只是將函數像表一樣對待,沒有額外的語法。

1

你可以像往常一樣引用函數返回表。例如,你的功能func1返回一列varchar(10)。沒有你的結構我會用generate_series。所以lateral join @murison是latking大約是水木清華這樣的:

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) 

在這裏我得到11700和11711,因爲我generate_series將返回值之間的OID:11700,11701,11702,並以此類推,直到11711 ...

IN運營商所需的解決方案是非常簡單和:所以你除以func1結果到陣列中的func2只是不需要

t=# select oid from pg_class 
where oid IN (select generate_series(11700,11711,1)); 
    oid 
------- 
11701 
11704 
11707 
11711 
(4 rows) 

相關問題