【发布时间】:2019-08-10 05:41:48
【问题描述】:
我正在尝试创建一个用于设置触发器的动态函数。
CREATE OR REPLACE FUNCTION device_bid_modifiers_count_per()
RETURNS TRIGGER AS
$$
DECLARE
devices_count INTEGER;
table_name regclass := TG_ARGV[0];
column_name VARCHAR := TG_ARGV[1];
BEGIN
LOCK TABLE device_types IN EXCLUSIVE MODE;
EXECUTE format('LOCK TABLE %s IN EXCLUSIVE MODE', table_name);
SELECT INTO devices_count device_types_count();
IF TG_OP = 'DELETE' THEN
SELECT format(
'PERFORM validate_bid_modifiers_count(%s, %s, OLD.%s, %s)',
table_name,
column_name,
column_name,
devices_count
);
ELSE
SELECT format(
'PERFORM validate_bid_modifiers_count(%s, %s, NEW.%s, %s)',
table_name,
column_name,
column_name,
devices_count
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
我的问题是动态函数validate_bid_modifiers_count() 的执行。目前它抛出:
ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function device_bid_modifiers_count_per() line 21 at SQL statement
我真的无法理解这一点。我知道format() 返回带有参数的正确函数调用字符串。我该如何解决这个问题并让它发挥作用?
【问题讨论】:
-
我试过
EXECUTE format('SELECT...)和EXECUTE/PERFORM/SELECT的不同组合 -
请显示您尝试使用
EXECUTE和PERFORM时的错误。我不是 PLPGSQL 人,但您肯定不想SELECT要运行的代码。错误可能会详细说明这种动态 SQL 是否可能(例如,我怀疑在动态执行的代码范围内甚至可能引用NEW和OLD。)
标签: sql postgresql triggers plpgsql dynamic-sql