TimescaleDB注册作业调用用户函数时参数不匹配问题求助
TimescaleDB作业调用函数参数不匹配问题解析
问题原因
TimescaleDB的自动化作业框架在执行注册的函数时,会默认自动传入两个固定参数:
- 第一个是
job_id(integer类型),代表当前作业的ID - 第二个是
job_config(jsonb类型),存储作业的配置信息
你的函数public.some_func仅定义了timestamp和boolean类型的参数,没有匹配(integer, jsonb)的函数签名,因此作业执行时触发了function public.some_func(integer, jsonb) does not exist的错误。
解决方法
方案1:兼容默认参数(无需使用job信息)
修改原有函数,新增这两个默认参数,让函数适配TimescaleDB的调用规则:
CREATE OR REPLACE FUNCTION public.some_func( job_id integer DEFAULT NULL, job_config jsonb DEFAULT NULL, arg1 timestamp without time zone DEFAULT NULL, arg2 BOOLEAN DEFAULT FALSE ) RETURNS text -- 原函数逻辑保持不变 ...
如果不想修改原有函数,也可以封装一个适配层函数:
CREATE FUNCTION public.some_func_wrapper(job_id integer, job_config jsonb) RETURNS text AS $$ BEGIN -- 调用原函数,可根据需求传递默认参数或从config解析参数 RETURN public.some_func(arg1 => NULL, arg2 => FALSE); END; $$ LANGUAGE plpgsql; -- 注册适配函数作为作业 SELECT add_job( 'public.some_func_wrapper'::REGPROC, '1 DAY'::INTERVAL, initial_start => '2024-09-22 08:00:00+00'::timestamptz, timezone => 'posix/Universal' );
方案2:利用job_config传递自定义参数
如果需要动态传递参数给函数,可以在注册作业时通过config字段传入,再在函数中解析:
-- 注册作业时传入自定义配置 SELECT add_job( 'public.some_func'::REGPROC, '1 DAY'::INTERVAL, initial_start => '2024-09-22 08:00:00+00'::timestamptz, timezone => 'posix/Universal', config => '{"arg1": "2024-09-22 08:00:00", "arg2": true}'::jsonb );
修改函数以接收并解析参数:
CREATE OR REPLACE FUNCTION public.some_func(job_id integer, job_config jsonb) RETURNS text AS $$ DECLARE v_arg1 timestamp without time zone; v_arg2 BOOLEAN; BEGIN -- 从config中解析参数,使用COALESCE设置默认值 v_arg1 := COALESCE((job_config->>'arg1')::timestamp, NULL); v_arg2 := COALESCE((job_config->>'arg2')::boolean, FALSE); -- 原函数逻辑,使用解析后的v_arg1和v_arg2 ... END; $$ LANGUAGE plpgsql;
内容的提问来源于stack exchange,提问作者Oto Shavadze
相关产品推荐
相关产品推荐

