sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man infogar data i tabellen med hjälp av lagrade procedurer i postgresql

PostgreSQL stödde inte lagrade procedurer förrän PG11. Innan dess kunde du få samma resultat med en funktion. Till exempel:

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;

Du kan sedan kalla det så här:

select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );

De huvudsakliga begränsningarna för Pg:s lagrade funktioner - jämfört med sanna lagrade procedurer - är:

  1. oförmåga att returnera flera resultatuppsättningar
  2. inget stöd för autonoma transaktioner (BEGIN, COMMIT och ROLLBACK inom en funktion)
  3. inget stöd för SQL-standardens CALL-syntax, även om ODBC- och JDBC-drivrutinerna översätter anrop åt dig.

Exempel

Med start från PG11, CREATE PROCEDURE syntax introduceras som ger stöd för transaktioner.

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$;

Som skulle kunna kallas med:

CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );


  1. Quickbooks ODBC-drivrutin

  2. Hur tar man bort dubbletter från kommaseparerad lista med regex i Oracle men jag vill inte ha dubblettervärden?

  3. BDE vs ADO i Delphi

  4. Android ListView:hur undviker man databasfråga i bindView()? Behöver hämta en till många relationsdata