sql >> データベース >  >> RDS >> PostgreSQL

Postgresqlの関数にテーブルまたは行を渡す方法は?

    行は、

    のような複合型で表されます。
    CREATE TYPE mytype  AS (
       id integer,
       name text,
       fromdate timestamp with time zone
    );
    

    このような型は関数の引数として使用できます。

    PostgreSQLテーブルごとに、同じ名前と列を持つタイプが自動的に存在します。

    CREATE TABLE mytable (
       id integer PRIMARY KEY,
       name text,
       fromdate timestamp with time zone NOT NULL
    );
    

    したがって、このタイプの配列を引数として取る関数を作成できます。

    CREATE OR REPLACE FUNCTION myfunc(arg mytable[]) RETURNS void
       LANGUAGE plpgsql IMMUTABLE STRICT AS
    $$DECLARE
       t mytable;
    BEGIN
       FOREACH t IN ARRAY arg LOOP
          RAISE NOTICE 'id = %', t.id;
       END LOOP;
    END;$$;
    

    このように呼び出すことができます(mytableに2つの行があると仮定します) ):

    SELECT myfunc(array_agg(mytable)) FROM mytable;
    NOTICE:  id = 1
    NOTICE:  id = 2
    ┌────────┐
    │ myfunc │
    ├────────┤
    │        │
    └────────┘
    (1 row)
    

    または、カーソルを引数として取る関数を作成することもできます:

    CREATE OR REPLACE FUNCTION myfunc(arg refcursor) RETURNS void
       LANGUAGE plpgsql IMMUTABLE STRICT AS
    $$DECLARE
       t mytable;
    BEGIN
       LOOP
          FETCH NEXT FROM arg INTO t;
          EXIT WHEN NOT FOUND;
          RAISE NOTICE 'id = %', t.id;
       END LOOP;
    END;$$;
    

    これは、トランザクションで次のように呼び出すことができます。

    BEGIN;
    DECLARE c CURSOR FOR SELECT * FROM mytable;
    SELECT myfunc('c');
    
    NOTICE:  id = 1
    NOTICE:  id = 2
    ┌────────┐
    │ myfunc │
    ├────────┤
    │        │
    └────────┘
    (1 row)
    
    COMMIT;
    


    1. SQL Server 2008 上の 7,000 万の非常に高密度の空間点群に対する最近傍クエリを最適化する

    2. JavaストアドプロシージャとPL/SQLストアドプロシージャ

    3. ブールフィールドにインデックスを追加する

    4. ページリダイレクトの問題Node-js