Function Procedure Packages Oracle PLSQL Tutorial

SQL> REM 05-RAND.SQL
SQL> REM This file contains the code for the Random package in
SQL> REM Chapter 5 of "Oracle PL/SQL Programming".  It illustrates
SQL> REM package initialization.
SQL>
SQL> REM This is version 1.0 of this file, updated 2/18/96.
SQL> REM Comments and questions should go to Scott Urman at
SQL> REM surman@us.oracle.com.
SQL>
SQL> CREATE OR REPLACE PACKAGE Random AS
  2  /* Random number generator.  Uses the same algorithm as the
  3     rand() function in C. */
  4
  5    -- Used to change the seed.  From a given seed, the same
  6    -- sequence of random numbers will be generated.
  7    PROCEDURE ChangeSeed(p_NewSeed IN NUMBER);
  8
  9    -- Returns a random integer between 1 and 32767.
 10    FUNCTION Rand RETURN NUMBER;
 11    --PRAGMA RESTRICT_REFERENCES(rand, WNDS );
 12
 13    -- Same as Rand, but with a procedural interface.
 14    PROCEDURE GetRand(p_RandomNumber OUT NUMBER);
 15
 16    -- Returns a random integer between 1 and p_MaxVal.
 17    FUNCTION RandMax(p_MaxVal IN NUMBER) RETURN NUMBER;
 18   -- PRAGMA RESTRICT_REFERENCES(RandMax, WNDS);
 19
 20    -- Same as RandMax, but with a procedural interface.
 21    PROCEDURE GetRandMax(p_RandomNumber OUT NUMBER,
 22                         p_MaxVal IN NUMBER);
 23  END Random;
 24  /
Package created.
SQL>
SQL> CREATE OR REPLACE PACKAGE BODY Random AS
  2
  3    /* Used for calculating the next number. */
  4    v_Multiplier  CONSTANT NUMBER := 22695477;
  5    v_Increment   CONSTANT NUMBER := 1;
  6
  7    /* Seed used to generate random sequence. */
  8    v_Seed        number := 1;
  9
 10    PROCEDURE ChangeSeed(p_NewSeed IN NUMBER) IS
 11    BEGIN
 12      v_Seed := p_NewSeed;
 13    END ChangeSeed;
 14
 15    FUNCTION Rand RETURN NUMBER IS
 16    BEGIN
 17      v_Seed := MOD(v_Multiplier * v_Seed + v_Increment,
 18                    (2 ** 32));
 19      RETURN BITAND(v_Seed/(2 ** 16), 32767);
 20    END Rand;
 21
 22    PROCEDURE GetRand(p_RandomNumber OUT NUMBER) IS
 23    BEGIN
 24      -- Simply call Rand and return the value.
 25      p_RandomNumber := Rand;
 26    END GetRand;
 27
 28    FUNCTION RandMax(p_MaxVal IN NUMBER) RETURN NUMBER IS
 29    BEGIN
 30      RETURN MOD(Rand, p_MaxVal) + 1;
 31    END RandMax;
 32
 33    PROCEDURE GetRandMax(p_RandomNumber OUT NUMBER,
 34                         p_MaxVal IN NUMBER) IS
 35    BEGIN
 36      -- Simply call RandMax and return the value.
 37      p_RandomNumber := RandMax(p_MaxVal);
 38    END GetRandMax;
 39
 40  BEGIN
 41    /* Package initialization.  Initialize the seed to the current
 42       time in seconds. */
 43    ChangeSeed(TO_NUMBER(TO_CHAR(SYSDATE, 'SSSSS')));
 44  END Random;
 45  /
Package body created.
SQL>