PostgreSQL ondersteunde geen opgeslagen procedures tot PG11. Daarvoor kon je hetzelfde resultaat krijgen met een functie. Bijvoorbeeld:
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;
Je kunt het dan zo noemen:
select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
De belangrijkste beperkingen van de opgeslagen functies van Pg - in vergelijking met echte opgeslagen procedures - zijn:
- onmogelijkheid om meerdere resultatensets te retourneren
- geen ondersteuning voor autonome transacties (BEGIN, COMMIT en ROLLBACK binnen een functie)
- geen ondersteuning voor de SQL-standaard CALL-syntaxis, hoewel de ODBC- en JDBC-stuurprogramma's oproepen voor u vertalen.
Voorbeeld
Vanaf PG11, de CREATE PROCEDURE
syntaxis is geïntroduceerd die ondersteuning biedt voor transacties.
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$;
Die zou kunnen worden aangeroepen met:
CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );