2017-08-02 19 views
2

私はPostgreSQLを初めて使用しています。PostgreSQLの別の関数からテーブル関数を呼び出すには?

私は、他の機能func2に、この出力を使用したい機能

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; 

を持っています。

次のコードのようにして、エラーが発生しました。

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; 

私はどのように私は、PostgreSQLでこれを達成することができます選択クエリではまだ別の関数に

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; 

func2の結果を使用したいですか?

+0

横結合を使用する – murison

+0

@mursion私はpostgresに新しいです。どのようにこれを達成することができますか? –

答えて

1

テーブルを使用するのと同じ方法で、クエリでセット返却関数(テーブル関数)を使用できます。

次のように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); 

あなた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) 
ここ

generate_seriesが値を返しますので、私は、11700と11711の間でOIDを取得: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) 

ので、あなたがfunc2に配列にfunc1の結果を割るにはちょうど必要とされていません。

関連する問題