繁体   English   中英

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

[英]How to insert data into table using stored procedures in 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 (?, ?, ?, ?, ?, ?);

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

在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;

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

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语法介绍其提供的交易支持。

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引入了SQL存储过程,允许用户在过程中使用嵌入式事务(即BEGIN,COMMIT / ROLLBACK)。 可以使用CREATE PROCEDURE命令创建过程,并使用CALL命令执行。

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;

正如您在表中已经提到的 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM