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 (?, ?, ?, ?, ?, ?);
私の要件:: ストアドプロシージャ?を使用してテーブルにデータを挿入する方法
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のストアド関数の主な制限は次のとおりです。
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' );
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コマンドを使用して実行。
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理解のためのリンクがあります
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;