Informix and standard SQL has no built-in random number functions/generators. This small bladelet provides this functionality.
udr_srand(seed) | sets the seed. |
udr_get_randmax() | returns whatever RAND_MAX is on your system. |
udr_rand() | returns an integer between 0 and RAND_MAX. |
udr_rand_n_m(n, n) | returns an integer between n and m. |
[udr_rand.c] #include <stdlib.h> #include "mi.h" void udr_srand(mi_integer seed, MI_FPARAM *fparam) { (void) fparam; srand(seed); } mi_integer udr_rand(MI_FPARAM *fparam) { (void) fparam; return rand(); } mi_integer udr_get_randmax(MI_FPARAM *fparam) { (void) fparam; return RAND_MAX; } mi_integer udr_rand_n_m(mi_integer n, mi_integer m, MI_FPARAM *fparam) { int range; (void) fparam; if ( n == m ) return n; if ( n < m ) range = 1 + m - n; else { range = 1 + n - m; n = m; } return n + (int) ((double)rand() / ((double)RAND_MAX + 1) * range); }
To compile the bladelet use the following Makefile
[Makefile] default : udr_rand.bld CC = gcc CFLAGS = -W -Wall -ansi -pedantic -O2 CBLDINCLS = -I${INFORMIXDIR}/incl/public -I${INFORMIXDIR}/incl/esql -I${INFORMIXDIR}/incl CBLDFLAGS = -DMI_SERVBUILD -fPIC -shared LDBLDFLAGS = -G #linux needs: LDBLDFLAGS = -shared -u _etext RM = rm -f .SUFFIXES: .SUFFIXES: .o .c .c.o: ${CC} ${CFLAGS} ${CBLDFLAGS} ${CBLDINCLS} -c $< FILES.c = udr_rand.c FILES.o = ${FILES.c:.c=.o} udr_rand.bld: ${FILES.o} ${LD} ${LDBLDFLAGS} -o $@ ${FILES.o} clean: ${RM} ${FILES.o} udr_rand.bld
To register the functions run the following SQL against the required database
[register.sql] create function udr_get_randmax() returns integer with (class="rnd") external name "$INFORMIXDIR/extend/rnd/udr_rand.bld(udr_get_randmax)" language c; create procedure udr_srand(seed integer) with (class="rnd") external name "$INFORMIXDIR/extend/rnd/udr_rand.bld(udr_srand)" language c; create function udr_rand() returns integer with (class="rnd") external name "$INFORMIXDIR/extend/rnd/udr_rand.bld(udr_rand)" language c; create function udr_rand_n_m(n integer, m integer) returns integer with (class="rnd") external name "$INFORMIXDIR/extend/rnd/udr_rand.bld(udr_rand_n_m)" language c;
VPCLASS=rnd
To discuss how Oninit ® can assist please call on +1-913-674-0360 or alternatively just send an email specifying your requirements.