Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Semantik gespeicherter Oracle-Prozeduren / -Funktionen in einem Transaktionskontext

Sie können RESTRICT_REFERENCES verwenden um anzuzeigen, dass eine Funktion keinen Paket- oder Datenbankstatus lesen/schreiben wird.

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

Früher war es so, dass SQL Ihnen nicht erlaubte, eine Funktion aufzurufen, es sei denn, es gab ein solches Versprechen, aber diese Einschränkung wurde aufgehoben.

Ich würde es vorziehen, es zu einem Unterscheidungsmerkmal zwischen einer Prozedur und einer Funktion zu machen. Denken Sie daran, dass eine aufrufende SQL-Anweisung nicht fehlschlägt, wenn eine PL/SQL-Funktion eine NO_DATA_FOUND-Ausnahme auslöst (da keine gefundenen Daten kein SQL-Fehler sind). Daher bevorzuge ich die Verwendung von Prozeduren, es sei denn, das Objekt wurde speziell dafür entwickelt, von SQL aus aufgerufen zu werden.