Download Latest Version tpc-c-ifmx.tar.gz (392.7 kB)
Email in envelope

Get an email when there's a new version of IIUG Software Repository

Home / StoredProcedures / random_spl
Name Modified Size InfoDownloads / Week
Parent folder
random.spl 2020-05-11 621 Bytes
readme.txt 2020-05-11 1.9 kB
Totals: 2 Items   2.5 kB 0
From: Jonathan Leffler <johnl@informix.com>
To: software@iiug.org
Subject: Random number in a stored procedure
Date: Mon, 8 Dec 1997 11:32:34 -0800 (PST)

On Sun, 7 Dec 1997, Nils Myklebust wrote:

> I doubt this would work as there is no way of returning anything from
> a system call short of having an external program inserting it into
> the database. Would be still slower.

Agreed.

>
> billy@west.co.za ("Billy Wheeler") wrote:
> :On  6 Dec 97 at 8:28, Ed Schaefer wrote:
> :> Anybody out there written a stored procedure to return a random
> :> number. Any help is appreciated!
> :
> :Blunt, slow and ugly (just like me! :-) --
> :
> :SYSTEM("exit `echo $RANDOM`") -- (Needs ksh)
> :
> :I think. I'm not really sure how you return things to SPs. Guaranteed
> :to be slow due to the system call, I'm afraid.

Since that's the case, we need a proper random number generator.  On the
assumption that the C Standard committee knew roughly what they were doing
when they specified a random number generator in the ISO 9899:1990
standard, here's an implementation of that generator in two functions,
sp_setseed(0 and sp_random().  The range of returned values is 0..32767.
Note the comment about MOD.  That was in a 9.12.UC2 IUS system.

Yours,
Jonathan Leffler (johnl@informix.com) #include <witticism.h>

-- @(#)$Id: random.spl,v 1.2 1997/12/08 19:31:44 johnl Exp $
--
-- Simple emulation of SRAND and RAND in SPL
-- Using random number generator suggested by C standard (ISO 9899:1990)

CREATE PROCEDURE sp_setseed(n INTEGER)
	DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1;
	LET seed = n;
END PROCEDURE;

CREATE PROCEDURE sp_random() RETURNING INTEGER;
	DEFINE GLOBAL seed DECIMAL(10) DEFAULT 1;
	DEFINE d DECIMAL(20,0);
	LET d = (seed * 1103515245) + 12345;
	-- MOD function does not handle 20-digit values...  Dammit!!
	LET seed = d - 4294967296 * TRUNC(d / 4294967296);
	RETURN MOD(TRUNC(seed / 65536), 32768);
END PROCEDURE;
Source: readme.txt, updated 2020-05-11