gpt4 book ai didi

sql - 取自变量的序列名称

转载 作者:行者123 更新时间:2023-11-29 13:30:04 25 4
gpt4 key购买 nike

如何创建一个新的序列,其名称来自一个变量?

让我们看下面的例子:

CREATE OR REPLACE FUNCTION get_value(_name_part character varying)
RETURNS INTEGER AS
$BODY$
DECLARE
result bigint;
sequencename character varying(50);
BEGIN
sequencename = CONCAT('constant_part_of_name_', _name_part);
IF((SELECT CAST(COUNT(*) AS INTEGER) FROM pg_class
WHERE relname LIKE sequencename) = 0)
THEN
CREATE SEQUENCE sequencename --here is the guy this is all about
MINVALUE 6000000
INCREMENT BY 1;
END IF;
SELECT nextval(sequencename) INTO result;
RETURN result;
END;
$BODY$
LANGUAGE plpgsql VOLATILE

现在,假设我想要一个 _name_part = 'Whatever' 的序列,所以我输入:

SELECT get_value('Whatever');

如果序列 constant_part_of_name_Whatever 不存在,我的函数应该创建它并取一个值;如果它存在,它应该只取一个值。但是,我创建了序列constant_part_of_name_sequencename

如何将变量的值放入序列定义中以使其工作?

最佳答案

当前接受的答案有很多问题。最重要的是,它没有将架构考虑在内。

改用:

CREATE OR REPLACE FUNCTION get_value(_name_part text)
RETURNS bigint AS
$func$
DECLARE
_seq text := 'constant_part_of_name_' || _name_part;
BEGIN

CASE (SELECT c.relkind = 'S'::"char"
FROM pg_namespace n
JOIN pg_class c ON c.relnamespace = n.oid
WHERE n.nspname = current_schema() -- or provide your schema!
AND c.relname = _seq)
WHEN TRUE THEN -- sequence exists
-- do nothing
WHEN FALSE THEN -- not a sequence
RAISE EXCEPTION '% is not a sequence!', _seq;
ELSE -- sequence does not exist, name is free
EXECUTE format('CREATE SEQUENCE %I MINVALUE 6000000 INCREMENT BY 1', _seq);
END CASE;

RETURN nextval(_seq);

END
$func$ LANGUAGE plpgsql;

SQL Fiddle.

要点

  • concat() 仅在可以涉及 NULL 值时才有用。我假设您不想传递 NULL

  • VOLATILE 是默认值,因此只是噪声。

  • 如果您想在 NULL 输入时返回 NULL,请添加 STRICT

关于sql - 取自变量的序列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com