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

postgresqlのストアドプロシージャを使用してテーブルにデータを挿入する方法

    PostgreSQLはPG11までストアドプロシージャをサポートしていませんでした。それ以前は、関数を使用して同じ結果を得ることができました。例:

    CREATE FUNCTION MyInsert(_sno integer, _eid integer, _sd date, _ed date, _sid integer, _status boolean)
      RETURNS void AS
      $BODY$
          BEGIN
            INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
            VALUES(_sno, _eid, _sd, _ed, _sid, _status);
          END;
      $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    

    その後、次のように呼び出すことができます:

    select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
    

    Pgのストアド関数の主な制限は、実際のストアドプロシージャと比較して、次のとおりです。

    1. 複数の結果セットを返すことができない
    2. 自律トランザクション(関数内のBEGIN、COMMIT、およびROLLBACK)はサポートされていません
    3. SQL標準のCALL構文はサポートされていませんが、ODBCおよびJDBCドライバーが呼び出しを変換します。

    PG11以降、CREATE PROCEDURE トランザクションのサポートを提供する構文が導入されました。

    CREATE PROCEDURE MyInsert(_sno integer, _eid integer, _sd date, _ed date, _sid integer, _status boolean)
    LANGUAGE SQL
    AS $BODY$
        INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
        VALUES(_sno, _eid, _sd, _ed, _sid, _status);   
    $BODY$;
    

    これは次のように呼び出すことができます:

    CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
    


    1. Ubuntu 9.xでORACLE_HOME変数を正しく設定するにはどうすればよいですか?

    2. SQL Serverデータベースにauto_increment主キーを追加するにはどうすればよいですか?

    3. ActiveRecordクエリの時間ベースの優先度

    4. mysql selectを書き換えて時間を短縮し、tmpをディスクに書き込みます