我有用户功能:
CREATE FUNCTION public.some_func(arg1 timestamp without time zone DEFAULT NULL, arg2
BOOLEAN DEFAULT FALSE)
RETURNS text
...
在 timescaledb(2.15.3) 中我将工作注册为:
SELECT add_job('public.some_func'::REGPROC,'1 DAY'::INTERVAL, initial_start => '2024-09-22 08:00:00+00'::timestamptz, timezone => 'posix/Universal');
作业不起作用,
some_func
没有每天打电话,我在timescaledb_information.job_errors
数据库中看到错误日志,这里err_message
显示:function public.some_func(integer, jsonb) does not exist
我不明白为什么 timescale 尝试使用
integer, jsonb
参数调用 public.some_func 函数?这个参数从哪里来,为什么不叫 public.some_func(timestamp, bool)
呢?
文档中的这一部分 使用时间刻度 > 用户定义的操作 > 关于用户定义的操作:
使用此代码创建函数:
CREATE FUNCTION totalRecords (job_id INT DEFAULT NULL, config JSONB DEFAULT NULL) RETURNS integer AS $total$ declare total integer; BEGIN SELECT count(*) into total FROM fill_measurements; RETURN total; END; $total$ LANGUAGE plpgsql;
这不仅仅是一个示例,如果您计划将例程注册为预定作业,它是您需要遵循的强制性模板。只要它们有默认值,您可能会列出这两个之外的其他参数,但我不确定您将如何传递它们。
您可以编写包装器或直接更改函数,以便它期望这些参数在
config jsonb
参数内传递。根据他们的一个例子进行工作:
CREATE FUNCTION public.some_func(
job_id int default null
, config jsonb default '{"arg1":null,"arg2":false}'::jsonb)
RETURNS text LANGUAGE plpgsql AS $f$
DECLARE
arg1 timestamp without timezone;
arg2 boolean;
BEGIN
SELECT jsonb_object_field_text(config, 'arg1')::timestamp INTO STRICT arg1;
SELECT jsonb_object_field_text(config, 'arg2')::boolean INTO STRICT arg2;
RAISE NOTICE 'arg1:%; arg2:%', arg1::text,arg2::text;
RETURN format('arg1:%; arg2:%', arg1::text,arg2::text);
END $f$;
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":"2011-11-11 11:11:11-11","arg2":true}'::jsonb);