如何使用postgresql中的存储过程将数据插入表中

09Q*_*534 19 sql postgresql postgresql-9.2

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)
);
Run Code Online (Sandbox Code Playgroud)

基本插入是::

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

...

INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status) VALUES (?, ?, ?, ?, ?, ?);
Run Code Online (Sandbox Code Playgroud)

我的要求::如何使用存储过程将数据插入表中?

Mik*_*sen 35

在PG11之前,PostgreSQL 不支持存储过程.在此之前,您可以使用函数获得相同的结果.例如:

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;
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
Run Code Online (Sandbox Code Playgroud)

与真实存储过程相比,Pg存储函数的主要限制是:

  1. 无法返回多个结果集
  2. 不支持自治事务(函数内的BEGIN,COMMIT和ROLLBACK)
  3. 尽管ODBC和JDBC驱动程序将为您转换调用,但不支持SQL标准CALL语法.

从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$;
Run Code Online (Sandbox Code Playgroud)

可以用以下方式调用:

CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
Run Code Online (Sandbox Code Playgroud)

  • @ user2561626 - Postgres支持各种语言,例如PL/pgSQL,Perl,C,甚至还有JavaScript扩展.`VOLATILE`表示每次都必须运行函数*且不能缓存结果(只有VOLATILE函数可能会更改数据库).这是默认值,因此我的代码实际上是多余的.COST为计划员提供估计的执行成本.[更多详情](http://www.postgresql.org/docs/9.1/static/sql-createfunction.html) (2认同)

Luk*_*zda 7

从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' );
Run Code Online (Sandbox Code Playgroud)

此外,它允许处理交易

SQL存储过程

PostgreSQL 11引入了SQL存储过程,允许用户在过程中使用嵌入式事务(即BEGIN,COMMIT/ROLLBACK).可以使用CREATE PROCEDURE命令创建过程,并使用CALL命令执行.