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 (?, ?, ?, ?, ?, ?);
我的要求::如何使用存储过程将数据插入表格?
答案 0 :(得分:32)
PostgreSQL didn't support stored procedures直到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' );
答案 1 :(得分:7)
从PostgreSQL 11开始,你可以create stored procedures使用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' );
另外它允许handle transaction
SQL存储过程
PostgreSQL 11引入了允许用户使用的SQL存储过程 嵌入式事务(即BEGIN,COMMIT / ROLLBACK)在一个 过程。可以使用CREATE PROCEDURE创建过程 命令并使用CALL命令执行。
答案 2 :(得分:2)
PostgreSQL不支持存储过程,但您可以使用函数获得相同的结果。
您想要插入表中的数据是否作为您正在创建的函数的参数给出。
CREATE OR REPLACE 表示数据库中是否已存在具有相同名称的函数(您正在使用),然后它将被替换,否则如果不存在具有相同名称的函数然后将创建一个新功能。
您必须在函数体内编写insesrtion查询。
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;
正如您在表格中已经提到的 状态的默认值,现在无需在该列中插入数据
以下是 SQLFiddle 链接,供您理解
答案 3 :(得分:1)
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;