Si algo le falta al Informix (y al Posgres) son funciones para trabajar con números aleatorios. En algún momento de los más de 8 años de sufrimiento con este SGBD, tuve que codificar estas funciones, y me pareció una buena idea compartirlas… Explicaría una por una cada función, pero la verdad que creo no hace al tema, así que espero que alcance con los nombres de cada una y cualquier cosa preguntan al final del hilo.
drop procedure "dba".sp817_setrandomseed(decimal);
CREATE PROCEDURE sp817_SetRandomSeed(n DECIMAL(10) DEFAULT NULL)
DEFINE GLOBAL seed DECIMAL(10) DEFAULT NULL;
DEFINE hora integer;
DEFINE minuto integer;
DEFINE segundo integer;
IF n IS NULL THEN
let hora = current::datetime HOUR TO HOUR::char(2)::int;
let minuto = current::datetime MINUTE TO MINUTE::char(2)::int;
let segundo = current::datetime SECOND TO SECOND::char(2)::int;
IF minuto>segundo THEN
LET n = hora*minuto/(segundo+1);
ELSE
LET n = hora*segundo/(minuto+1);
END IF;
END IF;
LET seed = n;
END PROCEDURE;
grant execute on procedure "dba".sp817_setrandomseed(decimal) to public as dba;
drop function "dba".sp817_getrandomseed();
CREATE FUNCTION sp817_GetRandomSeed() RETURNING DECIMAL(10)
DEFINE GLOBAL seed DECIMAL(10) DEFAULT NULL;
RETURN seed;
END FUNCTION;
grant execute on function "dba".sp817_getrandomseed() to public as dba;
drop function "dba".sp817_random();
CREATE FUNCTION sp817_Random() RETURNING FLOAT
DEFINE GLOBAL seed DECIMAL(10) DEFAULT NULL;
DEFINE d DECIMAL(20,0);
DEFINE x1 FLOAT;
DEFINE x2 FLOAT;
IF seed is NULL THEN
EXECUTE PROCEDURE sp817_SetRandomSeed();
END IF;
LET d = (seed * 1103515245) + 12345;
LET seed = d - 4294967296 * TRUNC(d / 4294967296);
LET x1 = MOD(TRUNC(seed / 65536), 32768);
LET d = (seed * 1103515245) + 12345;
LET seed = d - 4294967296 * TRUNC(d / 4294967296);
LET x2 = MOD(TRUNC(seed / 65536), 32768);
IF x1 > x2 then
RETURN x2/x1;
ELSE
RETURN x1/x2;
END IF;
END FUNCTION;
grant execute on function "dba".sp817_random() to public as dba;
drop function "dba".sp817_randomdesdehasta(integer,integer);
create function sp817_RandomDesdeHasta(desde integer, hasta integer) returning integer
if hasta<desde then
return cast(floor((desde-hasta+1)*sp817_random()) as integer) + hasta;
end if;
return cast(floor((hasta-desde+1)*sp817_random()) as integer) + desde;
end function;
grant execute on function "dba".sp817_randomdesdehasta(integer,integer) to public as dba;
drop function "dba".sp817_getrandompwd(integer);
create function sp817_getRandomPwd(longitud integer default 15) returning varchar(45)
begin
define v_pwd varchar(45);
define v_i integer;
define v_chrs varchar(100);
define v_l integer;
let v_chrs = "POIUYTREWQÑLKJHGFDSAMNBVCXZpoiuytrewqñlkjhgfdsamnbvcxz1234567890";
let v_l = CHAR_LENGTH(v_chrs);
if longitud < 8 then
let longitud = 8;
elif longitud > 45 then
let longitud = 45;
end if;
let v_pwd = "";
for v_i in (1 to longitud)
let v_pwd = v_pwd || SUBSTR(v_chrs, sp817_randomdesdehasta(1,v_l), 1);
end for;
return v_pwd;
end;
end function;
grant execute on function "dba".sp817_getrandompwd(integer) to public as dba;