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

PostgreSQLのカーソルベースのレコード

    1。暗黙カーソル

    ほとんどの場合、 FORの暗黙カーソルを使用することをお勧めします。 ループ やや遅くて扱いにくい明示カーソルに頼るよりも。私は何千ものplpgsql関数を作成しましたが、明示的なカーソルでいっぱいの手だけが意味をなしました。

    CREATE OR REPLACE FUNCTION avoidable_states()
      RETURNS SETOF varchar AS
    $func$
    DECLARE
        rec record;
    BEGIN   
       FOR rec IN
          SELECT *
          FROM   address ad
          JOIN   city    ct USING (city_id)
       LOOP
          IF rec.city LIKE '%hi%' THEN
              RETURN NEXT rec.city;               
          END IF;
       END LOOP;
    END
    $func$  LANGUAGE plpgsql STABLE;
    

    余談ですが、関数にはボラティリティを必要とするものは何もありませんVOLATILESTABLEを使用する 。

    2。セットベースのアプローチ

    ほとんどの場合、可能であればセットベースのアプローチを使用することをお勧めします。 。 RETURN QUERYを使用する クエリから直接セットとして返す。

    CREATE OR REPLACE FUNCTION avoidable_states()
      RETURNS SETOF varchar AS
    $func$
    BEGIN   
       RETURN QUERY
       SELECT ct.city
       FROM   address ad
       JOIN   city    ct USING (city_id)
       WHERE  ct.city LIKE '%hi%';
    END
    $func$  LANGUAGE plpgsql STABLE;
    

    3。 SQL関数

    単純なケース(おそらく単純化)の場合は、単純なSQL関数を使用することも、クエリだけを使用することもできます。

    CREATE OR REPLACE FUNCTION avoidable_states()
      RETURNS SETOF varchar AS
    $func$
       SELECT ct.city
       FROM   address ad
       JOIN   city    ct USING (city_id)
       WHERE  ct.city LIKE '%hi%';
    $func$  LANGUAGE sql STABLE;
    


    1. SQLで列の値を合計する方法は?

    2. OracleのLISTAGG関数を一意のフィルターで使用するにはどうすればよいですか?

    3. SQLサーバーにIPアドレスを格納するための最も適切なデータ型は何ですか?

    4. Amazon EC2、InnoDB:mmap(xバイト)が失敗したため、mysqlが開始を中止しました。 errno 12