从查询执行 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 ?
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;```