TimescalDB 中注册的作业调用了错误的用户函数

问题描述 投票:0回答:1

我有用户功能:

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)
呢?

postgresql timescaledb
1个回答
0
投票

文档中的这一部分 使用时间刻度 > 用户定义的操作 > 关于用户定义的操作:

使用此代码创建函数:

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);
© www.soinside.com 2019 - 2024. All rights reserved.