web-dev-qa-db-ja.com

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

CREATE TABLE app_for_leave
(
  sno integer NOT NULL,
  eid integer,
  ename varchar(20),
  sd date,
  ed date,
  sid integer,
  status boolean DEFAULT false,
  CONSTRAINT pk_snoa PRIMARY KEY (sno)
);

基本的な挿入は::です

INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
 VALUES(1,101,'2013-04-04','2013-04-04',2,'f' );

...

INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status) VALUES (?, ?, ?, ?, ?, ?);

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

19
09Q71AO534

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. ODBCおよびJDBCドライバーは呼び出しを変換しますが、SQL標準CALL構文はサポートしていません。

PG11以降、CREATE PROCEDURE構文は introduced であり、トランザクションのサポートを提供します。

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' );
33

PostgreSQL 11以降では、 ストアドプロシージャを作成 を使用して、 [〜#〜] call [〜#〜] を使用して呼び出すことができます。

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

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

さらに、 トランザクションの処理

SQLストアドプロシージャ

PostgreSQL 11では、ユーザーがプロシージャ内で埋め込みトランザクション(つまり、BEGIN、COMMIT/ROLLBACK)を使用できるようにするSQLストアドプロシージャが導入されています。CREATEを使用してプロシージャを作成できますPROCEDUREコマンドおよびCALLコマンドを使用して実行。

7
Lukasz Szozda

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

テーブルに挿入するデータはすべて、作成する関数のパラメーターとして指定されます。

CREATE OR REPLACEは、同じ名前(使用している)の関数がデータベースに既に存在するかどうかを表します。それが置き換えられるか、同じ名前の関数が存在しない場合、新しい関数が作成されます。

関数の本体内に挿入クエリを作成する必要があります。

CREATE OR REPLACE FUNCTION Insert_into_table(_sno INTEGER, _eid INTEGER, _ename VARCHAR(20), _sd DATE, _ed DATE, _sid INTEGER)
      RETURNS void AS
      $BODY$
          BEGIN
            INSERT INTO app_for_leave(sno, eid, sd, ed, sid)
            VALUES(_sno, _eid, _sd, _ed, _sid);
          END;
      $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;

既に表で列のデフォルト値について述べているようにStatus今ではその列にデータを挿入する必要はありません

ここにSQLFiddle理解のためのリンクがあります

2
09Q71A0548
CREATE OR REPLACE FUNCTION  new_bolshek(parent_id bigint, _key text, _value text, enabled boolean)
  RETURNS SETOF bolshekter AS
  $BODY$
  DECLARE
    new_id integer;
    returnrec bolshekter;
  BEGIN
        INSERT INTO bolshekter(parent_id, content_key, content_value, enabled)
        VALUES(parent_id, _key, _value, enabled) RETURNING id INTO new_id;
        FOR returnrec IN SELECT * FROM bolshekter where id=new_id LOOP
            RETURN NEXT returnrec;
        END LOOP;
  END;
  $BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
1
Yerbol