sql >> Database teknologi >  >> RDS >> Oracle

Semantik af Oracles lagrede procedurer/funktioner i en transaktionskontekst

Du kan bruge RESTRICT_REFERENCES for at angive, at en funktion ikke vil læse/skrive pakke- eller databasetilstand.

CREATE PACKAGE t_pkg AS
   FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2;
   PRAGMA RESTRICT_REFERENCES(showup, WNDS, RNDS);
END t_pkg;
/
-- create the package body
CREATE OR REPLACE PACKAGE BODY t_pkg AS
   FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2 IS
    v_val varchar2(1);
   BEGIN
      select dummy into v_val from dual;
      RETURN v_val;
   END;
END t_pkg;
/

Det plejede at være sådan, at SQL ikke tillod dig at kalde en funktion, medmindre den gav et sådant løfte, men den begrænsning blev droppet.

Jeg foretrækker at gøre det til en skelnen mellem en procedure og en funktion. Det er værd at huske på, at hvis en PL/SQL-funktion fremkalder en NO_DATA_FOUND-undtagelse, fejler en kaldende SQL-sætning ikke (da ingen fundet data ikke er en SQL-fejl). Så jeg foretrækker at bruge procedurer, medmindre objektet er specifikt designet til at blive kaldt fra SQL.



  1. C# med MySQL via Connector/NET

  2. Repository Pattern uden LINQ eller anden ORM?

  3. Betingelser for tilslutning er vigtige?

  4. Oracle Update hænger