plpgsql 函数为基于行的租赁创建序列?
plpgsql function creates sequences for row based tenancy?
尝试创建一个函数来查找具有特定名称的序列(如果不存在)应该创建它。然后returns序列的函数值。似乎不起作用的部分功能是它测试序列是否已经存在的地方。下面是函数代码
CREATE OR REPLACE FUNCTION public."tenantSequence"(
vtenantid integer,
vtablename character)
RETURNS bigint AS
$BODY$DECLARE
vSeqName character varying;
vSQL character varying;
BEGIN
select ('t' || trim(to_char(vtenantid,'0000')) || vtablename) INTO vSeqName;
if not exists(SELECT 0 FROM pg_class where relkind = 'S' and relname = vSeqName )
then
vSQL := 'create sequence '||vSeqName||';';
execute vSQL;
ELSE
return 0;
end if;
return nextval(vSeqName) * 10000 + vtenantid;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public."tenantSequence"(integer, character)
OWNER TO postgres;
问题是 a_horse_with_no_name
提到的情况
更改了将 vSeqName 分配给以下行
vSeqName := lower('t' || trim(to_char(vtenantid,'0000')) || vtablename);
现在功能按预期运行。
尝试创建一个函数来查找具有特定名称的序列(如果不存在)应该创建它。然后returns序列的函数值。似乎不起作用的部分功能是它测试序列是否已经存在的地方。下面是函数代码
CREATE OR REPLACE FUNCTION public."tenantSequence"(
vtenantid integer,
vtablename character)
RETURNS bigint AS
$BODY$DECLARE
vSeqName character varying;
vSQL character varying;
BEGIN
select ('t' || trim(to_char(vtenantid,'0000')) || vtablename) INTO vSeqName;
if not exists(SELECT 0 FROM pg_class where relkind = 'S' and relname = vSeqName )
then
vSQL := 'create sequence '||vSeqName||';';
execute vSQL;
ELSE
return 0;
end if;
return nextval(vSeqName) * 10000 + vtenantid;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public."tenantSequence"(integer, character)
OWNER TO postgres;
问题是 a_horse_with_no_name
提到的情况更改了将 vSeqName 分配给以下行
vSeqName := lower('t' || trim(to_char(vtenantid,'0000')) || vtablename);
现在功能按预期运行。