如何在postgresql中的函数中使用setseed

时间:2016-08-03 20:13:21

标签: postgresql-9.3

我正在尝试在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(种子)处或附近的语法错误。如何使用此函数?

3 个答案:

答案 0 :(得分:1)

不能像这样调用一个函数。您需要使用select或PL / pgSQL,如果您不关心结果(setseed()的情况)请使用`perform:

perform setseed(seed);

或使用lehanh所示的set seed to 0.5;

答案 1 :(得分:0)

答案 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(即使参数实际上是正确的类型)。