使用EXECUTE评估PL / pgSQL中的动态条件

时间:2018-11-15 00:15:22

标签: sql postgresql plpgsql

我有一个需要根据值类型动态验证输入的功能。它是通过在另一个表中找到约束来实现的,但是为简单起见,我也在下面的函数中提供了约束。

该另一个表包含(value_type,value_constraint),其中value_constraint是包含例如value::int > 0。我需要在我的插入函数中动态检查此约束。我正在尝试使用EXECUTE来执行此操作,如下所示,但是它不起作用。

如何动态执行条件语句并将值作为布尔值获取到v_successful_insert中?

CREATE OR REPLACE FUNCTION insert_value(p_value_type text, p_value_constraint text, p_value text) RETURNS boolean
    AS $$
    DECLARE
        v_successful_insert bool;
    BEGIN
        EXECUTE p_value_constraint INTO v_successful_insert;

        IF v_successful_insert THEN
            INSERT INTO my_table (value_type, value)
            VALUES (p_value_type, p_value);
        END IF;
        RETURN v_successful_insert;
    END;
    $$
    LANGUAGE plpgsql volatile;

代码在Postgresql 10.6上运行。

1 个答案:

答案 0 :(得分:1)

您需要在执行过程中执行SELECT。例如:

DO $$
DECLARE
    p_value TEXT := 'x';
    p_value_constraint TEXT := '::int > 0';
    result BOOLEAN;
BEGIN
    BEGIN
        EXECUTE 'SELECT $1' || p_value_constraint
        INTO result
        USING p_value;
    EXCEPTION
        WHEN INVALID_TEXT_REPRESENTATION THEN
            result := FALSE;
    END;
    RAISE NOTICE '%', result;
END $$

打印为假