TimescaleDB add_job 在从函数触发时不起作用

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

从查询执行 TimescaleDB add_job 是有效的。例如:

SELECT add_job('my_stored_procedure', '1 day', NULL, NULL, true, NULL, true, NULL);

这将返回 job_id。我可以在

timescaledb_information.jobs
桌子上看到作业。

删除作业也可以。

SELECT delete_job(1023);

现在我尝试在函数内执行

add_job
函数,但失败了。

这里是函数(我已经删除了不相关的部分):

CREATE OR REPLACE FUNCTION check_and_add_job(proc_name_in TEXT, schedule_interval_in TEXT) RETURNS VOID AS
$$
BEGIN
  -- Here is the logic for checking if job exists, will RETURN in case it does
  -- This part will run only when there are no jobs with the same name
    PERFORM public.add_job(
        proc_name_in::text,
        schedule_interval_in::interval,
        NULL,
        NULL,
        true,
        NULL,
        true,
        NULL
    );
    RAISE NOTICE 'New job added successfully.';
    RETURN;
END;
$$ LANGUAGE plpgsql;

我执行该函数如下:

SELECT check_and_add_job('my_stored_procedure', '1 day');

但是我收到错误:

ERROR:  function public.add_job(text, interval, unknown, unknown, boolean, unknown, boolean, unknown) does not exist
LINE 1: SELECT public.add_job(proc_name_in::text, schedule_interval_...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  SELECT public.add_job(proc_name_in::text, schedule_interval_in::interval, NULL, NULL, true, NULL, true, NULL)
CONTEXT:  PL/pgSQL function check_and_add_job(text,text) line 29 at PERFORM 

SQL state: 42883

如何从函数执行 add_job ?

postgresql timescaledb
1个回答
0
投票

add_job
的第一个参数是
regproc
而不是
text

https://docs.timescale.com/api/latest/actions/add_job/#add_job

pg:adn@localhost/target=> \df add_job
                                                                                                        List of functions
 Schema |  Name   | Result data type |                                                                              Argument data types                                                                               |   Type
--------+---------+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------
 public | add_job | integer          | proc regproc, schedule_interval interval, config jsonb, initial_start timestamp with time zone, scheduled boolean, check_config regproc, fixed_schedule boolean, timezone text | FUNCTION

proc_name_in::text
更改为
proc_name_in::regproc

CREATE OR REPLACE FUNCTION check_and_add_job(proc_name_in TEXT, schedule_interval_in TEXT) RETURNS VOID AS
$$
BEGIN
  -- Here is the logic for checking if job exists, will RETURN in case it does
  -- This part will run only when there are no jobs with the same name
    PERFORM public.add_job(
        proc_name_in::regproc,
        schedule_interval_in::interval,
        NULL,
        NULL,
        true,
        NULL,
        true,
        NULL
    );
    RAISE NOTICE 'New job added successfully.';
    RETURN;
END;
$$ LANGUAGE plpgsql;```

© www.soinside.com 2019 - 2024. All rights reserved.