我尝试执行这个函数:
CREATE OR REPLACE FUNCTION public.increases_chrono(
chrono_seq_name text,
chrono_id_name text)
RETURNS TABLE(chrono_id bigint)
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
ROWS 1000
AS $$
DECLARE
retval bigint;
BEGIN
-- Check if sequence exist, if not create
IF NOT EXISTS (SELECT 0 FROM pg_class where relname = chrono_seq_name ) THEN
EXECUTE 'CREATE SEQUENCE "' || chrono_seq_name || '" INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;';
END IF;
-- Check if chrono exist in parameters table, if not create
IF NOT EXISTS (SELECT 0 FROM parameters where id = chrono_id_name ) THEN
EXECUTE 'INSERT INTO parameters (id, param_value_int) VALUES ( ''' || chrono_id_name || ''', 1)';
END IF;
-- Get next value of sequence, update the value in parameters table before returning the value
SELECT nextval(chrono_seq_name) INTO retval;
UPDATE parameters set param_value_int = retval WHERE id = chrono_id_name;
RETURN QUERY SELECT retval;
END;
$$;
ALTER FUNCTION public.increases_chrono(text, text)
OWNER TO maarch;
但是当我像这样命令他时:
SELECT increases_chrono('chrono_DAP_2023_seq' ,'chrono_DAP_2023')
我有错误:错误:关系“chrono_dap_2023_seq”不存在 上下文:SQL 语句“SELECT nextval(chrono_seq_name)” PL/pgSQL函数increase_chrono(text,text)第14行在SQL语句
SQL状态:42P01 有人可以帮助我吗
存在区分大小写的问题。
CREATE
看起来像
CREATE SEQUENCE "chrono_DAP_2023_seq"
INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;
标识符位于双引号内 - 因此区分大小写。
但是当您尝试使用它时,变量
chrono_seq_name
不会在双引号内传递,因此它不是区分大小写的标识符。使用 quote_ident
功能修复它:
-- Get next value of sequence, update the value in parameters
---table before returning the value
SELECT nextval(quote_ident(chrono_seq_name)) INTO retval;