sql >> Databasteknik >  >> RDS >> Oracle

Oracles semantik lagrade procedurer/funktioner i ett transaktionssammanhang

Du kan använda RESTRICT_REFERENCES för att indikera att en funktion inte kommer att läsa/skriva paket eller databastillstånd.

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 brukade vara så att SQL inte tillät dig att anropa en funktion om den inte gav ett sådant löfte, men den begränsningen försvann.

Jag föredrar att göra det till en skillnad mellan en procedur och en funktion. Det är värt att komma ihåg att om en PL/SQL-funktion ger ett NO_DATA_FOUND-undantag, misslyckas inte en anropande SQL-sats (eftersom ingen data hittas inte är ett SQL-fel). Så jag föredrar att använda procedurer om inte objektet är specifikt utformat för att anropas från SQL.



  1. Wild Card före och efter en sträng - MySql, PSQL

  2. mysql escapende enkla och dubbla citattecken

  3. EF Core GroupBy med Select Distinct Count

  4. Vad är vårintegration?