我正在尝试编写一个函数来创建变长的唯一随机令牌。然而,我被plpgsql语法难住了。我的意图是创建一个函数,该函数:
- 以表和列作为输入
- 生成给定长度和一组特定字符的随机字符串
- 检查字符串是否已经存在于列中
- 如果是(这种情况应该很少发生),则生成一个新的随机字符串。
- 否则,返回随机字符串
我的当前尝试看起来像这样:
CREATE FUNCTION random_token(_table TEXT, _column TEXT, _length INTEGER) RETURNS text AS $$
DECLARE
alphanum CONSTANT text := 'abcdefghijkmnopqrstuvwxyz23456789';
range_head CONSTANT integer := 25;
range_tail CONSTANT integer := 33;
random_string text;
BEGIN
REPEAT
SELECT substring(alphanum from trunc(random() * range_head + 1)::integer for 1) ||
array_to_string(array_agg(substring(alphanum from trunc(random() * range_tail + 1)::integer for 1)), '')
INTO random_string FROM generate_series(1, _length - 1);
UNTIL random_string NOT IN FORMAT('SELECT %I FROM %I WHERE %I = random_string;', _column, _table, _column)
END REPEAT;
RETURN random_string;
END
$$ LANGUAGE plpgsql;
然而,这并不起作用,并且给我一个不太有帮助的错误信息:
DatabaseError: error 'ERROR: syntax error at or near "REPEAT"
我尝试了许多变化,但由于不知道语法错误在哪里,所以我陷入了困境。您有什么想法来修复这个函数吗?
repeat
? - user330315