Postgresql 从另一个函数的结果创建PLPGSQL函数
有人知道如何将PLPGSQL函数体设置为另一个函数结果的文本吗?例如,这就是我所尝试的:Postgresql 从另一个函数的结果创建PLPGSQL函数,postgresql,triggers,plpgsql,postgresql-9.3,Postgresql,Triggers,Plpgsql,Postgresql 9.3,有人知道如何将PLPGSQL函数体设置为另一个函数结果的文本吗?例如,这就是我所尝试的: CREATE FUNCTION "Foo"() RETURNS TEXT AS $$ BEGIN RETURN 'BEGIN END;'; END; $$ LANGUAGE PLPGSQL; CREATE FUNCTION "Bar"() RETURNS TRIGGER AS "Foo"() LANGUAGE PLPGSQL; 我希望创建的“Bar”等同于以下内容: CR
CREATE FUNCTION "Foo"() RETURNS TEXT AS $$
BEGIN
RETURN 'BEGIN END;';
END;
$$ LANGUAGE PLPGSQL;
CREATE FUNCTION "Bar"() RETURNS TRIGGER AS "Foo"() LANGUAGE PLPGSQL;
我希望创建的“Bar”等同于以下内容:
CREATE FUNCTION "Bar"() RETURNS TRIGGER AS $$
BEGIN END;
$$ LANGUAGE PLPGSQL;
有人知道如何完成这样的事情吗(例如,根据另一个函数的结果定义一个函数体)?谢谢,谢谢克雷格·林格的建议。这是我为生成函数而编写的代码:
CREATE FUNCTION "Foo"() RETURNS VOID AS $$
BEGIN
EXECUTE
'CREATE FUNCTION ' || QUOTE_IDENT('Bar') || '() RETURNS TRIGGER AS $a$' || chr(10) ||
'BEGIN' || chr(10) ||
'END;' || chr(10) ||
'$a$ LANGUAGE PLPGSQL;';
END;
$$ LANGUAGE PLPGSQL;
这是可以做到的,但这是一场丑陋的安全噩梦。你能解释一下你为什么要这样做吗?提供上下文可能会导致解决问题的另一种方法。如果确实要这样做,请使用
EXECUTE
运行CREATE函数的文本,该子句是使用format(…)
生成的。但是为什么不让一个函数调用另一个呢?还要注意,触发器函数也可以有自己的参数,如果你想实现的话。f、 前<代码>创建触发器。。。执行程序“Bar”('param 1 val',42)代码>我之所以尝试这样做,是因为我希望对多个视图执行相同的逻辑,其中函数之间唯一的变化是视图名称(和关联的表)。我知道我可以使用EXECUTE并传入表名,但这比我在没有EXECUTE语句的情况下简单地创建同一个函数18次性能要差。我最终选择了@CraigRinger解决方案,如果有人想这么做,我会在回答中详细解释。