PostgreSQL nepodporoval uložené procedury až do PG11. Předtím jste mohli získat stejný výsledek pomocí funkce. Například:
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;
Pak to můžete nazvat takto:
select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
Hlavní omezení uložených funkcí Pg - ve srovnání se skutečnými uloženými procedurami - jsou:
- nemožnost vrátit více sad výsledků
- žádná podpora pro autonomní transakce (BEGIN, COMMIT a ROLLBACK v rámci funkce)
- žádná podpora pro syntaxi CALL standardu SQL, ačkoli ovladače ODBC a JDBC přeloží volání za vás.
Příklad
Počínaje PG11, CREATE PROCEDURE
je zavedena syntaxe, která poskytuje podporu pro transakce.
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$;
Což by se dalo volat pomocí:
CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );