我有一个需要根据值类型动态验证输入的功能。它是通过在另一个表中找到约束来实现的,但是为简单起见,我也在下面的函数中提供了约束。
该另一个表包含(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上运行。
答案 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 $$
打印为假