是的,如果您使用EXECUTE并将其包装在FUNCTION中,则可以.函数调用允许您传递参数,在FUNCTION中使用字符串操作来修改DDL语句.最后,在FUNCTION中使用EXECUTE就是这样.以下是参数化CREATE SEQUENCE语句的简单示例…
DROP FUNCTION sf.start_mc(integer);
CREATE FUNCTION sf.start_mc(thefirst integer) RETURNS void AS $$
BEGIN
EXECUTE format('CREATE SEQUENCE sf.mastercase START %s',thefirst);
END;
$$LANGUAGE plpgsql;
我们使用字符串函数“format”来操作语句并包含传递给函数的参数.当然,您的SQL看起来很不寻常,特别是如果在调用它之前包含CREATE FUNCTION.这个例子来自我最近做过的数据迁移工作.在创建函数后,我们使用它如下:
DROP SEQUENCE sf.mastercase;
-- the following uses the above function to set the starting value of a new sequence based on the last used
-- in the widget table
select sf.start_mc((select substring("widgetId",4)::integer + 1 from widgets
where "widgetId" like 'MC-%'
order by "widgetId" desc
limit 1));
请注意,外部SELECT不会选择任何内容,它只是放置一个函数调用的地方.作为参数传递的数字来自内部SELECT,它包含在括号中.一个更简单的电话会是
select sf.start_mc(42);
您可以在CREATEd FUNCTION中包装任何内容.但这确实意味着您仍然坚持使用PostgreSQL,并且需要将您的数据库架构和架构更改集成到您的开发过程中作为一等公民.