You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TimescaleDB在自定义函数中调用add_job失败的问题

解决自定义函数中调用TimescaleDB add_job失败的问题

错误根源在于PL/pgSQL无法自动推断NULL参数的类型,导致与add_job的函数签名不匹配。直接在SQL中调用时PostgreSQL能自动推断类型,但在PL/pgSQL函数内部必须明确指定类型或使用命名参数。

方案一:显式转换NULL参数类型

将每个NULL转换为add_job对应参数的类型(参考TimescaleDB函数签名:config jsonb、initial_start timestamptz、job_id integer、if_not_exists boolean):

CREATE OR REPLACE FUNCTION check_and_add_job(proc_name_in TEXT, schedule_interval_in TEXT) RETURNS VOID AS
$$
BEGIN
  -- 此处为检查任务是否存在的逻辑,若存在则返回
  -- 仅当无同名任务时执行以下代码
    PERFORM public.add_job(
        proc_name_in::text,
        schedule_interval_in::interval,
        NULL::jsonb,
        NULL::timestamptz,
        true,
        NULL::integer,
        true,
        NULL::boolean
    );
    RAISE NOTICE 'New job added successfully.';
    RETURN;
END;
$$ LANGUAGE plpgsql;

方案二:使用命名参数调用(推荐)

利用add_job的默认参数值,仅显式传递需要自定义的参数,避免NULL类型推断问题,代码更简洁易读:

CREATE OR REPLACE FUNCTION check_and_add_job(proc_name_in TEXT, schedule_interval_in TEXT) RETURNS VOID AS
$$
BEGIN
  -- 此处为检查任务是否存在的逻辑,若存在则返回
  -- 仅当无同名任务时执行以下代码
    PERFORM public.add_job(
        procedure_name := proc_name_in,
        schedule_interval := schedule_interval_in::interval,
        enabled := true,
        scheduled := true
    );
    RAISE NOTICE 'New job added successfully.';
    RETURN;
END;
$$ LANGUAGE plpgsql;

内容的提问来源于stack exchange,提问作者Íhosko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:29