将视图的名称作为参数传递给函数
问题描述:
我可以传递视图的名称作为函数的参数吗?例如:将视图的名称作为参数传递给函数
CREATE OR REPLACE FUNCTION example_test(test type_view) return void as $$
BEGIN
start_ts = CLOCK_TIMESTAMP();
REFRESH MATERIALIZED VIEW test;
GET DIAGNOSTICS total_rows = ROW_COUNT;
INSERT INTO control_dw_monitoring (name, start_time, end_time, total)
VALUES ('view points that never contacted', start_ts, CLOCK_TIMESTAMP(), total_rows);
END
$$ language plpgsql;
答
尝试以下方法:
CREATE FUNCTION refresh_view_by_name(view_name text) RETURNS VOID AS $$
BEGIN
EXECUTE 'REFRESH MATERIALIZED VIEW ' || view_name::regclass;
END
$$ LANGUAGE PLPGSQL;
答
的视图的名称是一个标识符,而不是一个值。你不能参数化它,所以你需要动态SQL与EXECUTE
- 你需要避免SQL注入。首先制定参数为regclass
。
CREATE OR REPLACE FUNCTION example_test(_v regclass)
RETURNS VOID AS
$func$
DECLARE
start_ts timestamptz := clock_timestamp();
total_rows int;
BEGIN
EXECUTE 'REFRESH MATERIALIZED VIEW ' || _v; -- converted to text automatically
GET DIAGNOSTICS total_rows = ROW_COUNT;
INSERT INTO control_dw_monitoring (name, start_time, end_time, total)
VALUES (_v::text, start_ts, clock_timestamp(), total_rows);
END
$func$ LANGUAGE plpgsql;
修正了其中的一些错误。
相关答案与更多的解释:
你需要为这个动态SQL:http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL -STATEMENTS-EXECUTING-DYN – 2015-02-09 12:27:10
[那么你有答案吗?](http://meta.stackexchange.com/a/5235/169168) – 2015-07-24 03:21:25