我正在尝试在postgresq中创建一个函数来创建一个随机可预测的字符串(用作用户和密码)。我写了以下代码:
CREATE OR REPLACE FUNCTION colon.random_user_or_password(integer)
RETURNS text AS
$BODY$
DECLARE
letras_o_numeros TEXT[];
letras_o_numeros_longitud INT;
rand_user_or_pass TEXT;
seed REAL;
BEGIN
letras_o_numeros=array['a','b','c','d','e','f','g','h','i','j','k','l','m','o','p','q','r','s','t','u','b','w','x','y','z','A','B','C','D','E',
'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'];
letras_o_numeros_longitud=array_length(letras_o_numeros, 1);
rand_user_or_pass='';
seed=$1/power(10,ceil(log($1)));
setseed(seed);
WHILE char_length(rand_user_or_pass)<8 LOOP
rand_user_or_pass=rand_user_or_pass||letras_o_numeros[ceil(random()*letras_o_numeros_longitud)];
END LOOP;
RETURN rand_user_or_pass;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
但是当我尝试创建该函数时,它会给我以下错误: 第15行中setseed(种子)处或附近的语法错误。如何使用此函数?
答案 0 :(得分:1)
不能像这样调用一个函数。您需要使用select
或PL / pgSQL,如果您不关心结果(setseed()
的情况)请使用`perform:
perform setseed(seed);
或使用lehanh所示的set seed to 0.5;
。
答案 1 :(得分:0)
您可以使用set seed to 0.5;
。参考:https://til.hashrocket.com/posts/495ed1fb33-set-a-seed-for-the-random-number-generator
答案 2 :(得分:0)
要在函数中使用,应始终执行PERFORM
来设置种子。
例如...
CREATE OR REPLACE FUNCTION DETERMINISTIC_RANDOM(p_seed NUMERIC) RETURNS NUMERIC AS $$
BEGIN
PERFORM SETSEED(p_seed);
RETURN RANDOM();
END;
$$ LANGUAGE plpgsql;
如果将PERFORM SETSEED(p_seed);
行更改为SET SEED TO p_seed;
,它将失败并显示ERROR: parameter "seed" requires a numeric value
(即使参数实际上是正确的类型)。