Как вставить данные в таблицу с помощью хранимых процедур в 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 по сравнению с истинными хранимыми процедурами являются:
- невозможность вернуть несколько результирующих наборов
- нет поддержки автономных транзакций (BEGIN, COMMIT и ROLLBACK внутри функции)
- нет поддержки синтаксиса 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;