Оценить динамическое состояние в PL / pgSQL, используя EXECUTE - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть функция, которая должна динамически проверять ввод на основе типа значения. Это достигается путем нахождения ограничения в другой таблице, но для простоты я также предоставлю ограничение в приведенной ниже функции.

Эта другая таблица содержит (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 голосов
/ 15 ноября 2018

Вам нужно сделать 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 $$

Отпечатки ЛОЖЬ

...