TimescaleDB在自定义函数中调用add_job失败的问题
解决自定义函数中调用TimescaleDB add_job失败的问题
错误根源在于PL/pgSQL无法自动推断NULL参数的类型,导致与add_job的函数签名不匹配。直接在SQL中调用时PostgreSQL能自动推断类型,但在PL/pgSQL函数内部必须明确指定类型或使用命名参数。
方案一:显式转换NULL参数类型
将每个NULL转换为add_job对应参数的类型(参考TimescaleDB函数签名:config jsonb、initial_start timestamptz、job_id integer、if_not_exists boolean):
CREATE OR REPLACE FUNCTION check_and_add_job(proc_name_in TEXT, schedule_interval_in TEXT) RETURNS VOID AS $$ BEGIN -- 此处为检查任务是否存在的逻辑,若存在则返回 -- 仅当无同名任务时执行以下代码 PERFORM public.add_job( proc_name_in::text, schedule_interval_in::interval, NULL::jsonb, NULL::timestamptz, true, NULL::integer, true, NULL::boolean ); RAISE NOTICE 'New job added successfully.'; RETURN; END; $$ LANGUAGE plpgsql;
方案二:使用命名参数调用(推荐)
利用add_job的默认参数值,仅显式传递需要自定义的参数,避免NULL类型推断问题,代码更简洁易读:
CREATE OR REPLACE FUNCTION check_and_add_job(proc_name_in TEXT, schedule_interval_in TEXT) RETURNS VOID AS $$ BEGIN -- 此处为检查任务是否存在的逻辑,若存在则返回 -- 仅当无同名任务时执行以下代码 PERFORM public.add_job( procedure_name := proc_name_in, schedule_interval := schedule_interval_in::interval, enabled := true, scheduled := true ); RAISE NOTICE 'New job added successfully.'; RETURN; END; $$ LANGUAGE plpgsql;
内容的提问来源于stack exchange,提问作者Íhosko
相关产品推荐
相关产品推荐

