Как вставить данные в таблицу с помощью хранимых процедур в 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 (?, ?, ?, ?, ?, ?);

Мое требование :: Как вставить данные в таблицу с помощью хранимых процедур?

Ответ 1

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. нет поддержки синтаксиса CALL стандарта SQL, хотя драйверы ODBC и JDBC будут переводить вызовы для вас.

пример

Начиная с 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' );

Ответ 2

Начиная с 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.

Ответ 3

PostgreSQL не поддерживает хранимые процедуры, но вы можете получить тот же результат с помощью функции.

Независимо от того, какие данные вы хотите вставить в таблицу, задаются как параметры для создаваемой функции.

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ означает, что функция с тем же именем (вы используете) уже присутствует в базе данных, затем она будет заменена или если функция с таким же именем отсутствует то будет создана новая функция.

Вы должны написать запрос 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 для понимания

Ответ 4

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;