PostgreSQL hat bis PG11 keine gespeicherten Prozeduren unterstützt. Zuvor konnten Sie dasselbe Ergebnis mit einer Funktion erzielen. Zum Beispiel:
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;
Sie können es dann so nennen:
select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
Die Haupteinschränkungen der gespeicherten Funktionen von Pg im Vergleich zu echten gespeicherten Prozeduren sind:
- Unfähigkeit, mehrere Ergebnissätze zurückzugeben
- keine Unterstützung für autonome Transaktionen (BEGIN, COMMIT und ROLLBACK innerhalb einer Funktion)
- keine Unterstützung für die SQL-Standard-CALL-Syntax, obwohl die ODBC- und JDBC-Treiber Aufrufe für Sie übersetzen.
Beispiel
Beginnend mit PG11, dem CREATE PROCEDURE
Syntax eingeführt, die Transaktionen unterstützt.
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$;
Was aufgerufen werden könnte mit:
CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );