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

リスト/配列のPL/pgSQL制御構造

    CREATE OR REPLACE FUNCTION CREATE_PAYMENT(p_amount_list numeric[])
      RETURNS numeric AS
    $func$
    DECLARE
       s_chk_amnt numeric := 0; -- init variable!
       r          numeric;
    BEGIN
    -- IF p_amount_list <> '{}' THEN  -- just noise
       FOREACH r IN ARRAY p_amount_list
       LOOP
          s_chk_amnt := s_chk_amnt + r;
       END LOOP;
    -- END IF;
    
    RETURN s_chk_amnt;
    END
    $func$ LANGUAGE plpgsql
    

    主なポイント

    • Oracleのnumbernumericです。 Postgresで 。ただし、小数桁がない場合は、intを使用することをお勧めします。 またはbigint Postgresで。 OracleとPostgres間のタイプマッピングについて

    • Postgresには、Oracleのような"テーブルタイプ"がありません配列タイプ を使用します 、numericの配列 この場合:numeric[]

    • IF p_amount_list <> '{}' ... NULLと「空の配列」を同様に除外します。オリジナルのように2回目のチェックは必要ありません。しかし、IF まったく必要ありません。 NULLまたは空の配列の場合、ループはとにかく入りません。

    • r 要素自体を保持し、そのインデックスではありません。 (したがって、一致するデータ型である必要があります。)

    これは、FOREACHの基本的な構文を示しています。 plpgsql関数でループします。そうでなければ、高価なナンセンスになります 、はるかに単純で高速なものに置き換える方がよい:

    SELECT sum(elem) AS sum_amount
    FROM   unnest(p_amount_list) elem;
    



    1. SQL Server2014CTP1での優先度の低いロック待機オプションの調査

    2. 再生の紹介—SpotlightCloudの新しいポイントインタイム診断

    3. データベースのメンテナンスを容易にするためのモデル化方法

    4. ユーザーごとに1つのコメントだけの最後のコメントを表示する