2015-02-09 3 views
1

Могу ли я передать имя представления в качестве параметра функции? Пример:Передача имени представления в качестве параметра функции

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; 
+0

Вам нужен динамический SQL для этого: http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL -STATEMENTS-EXECUTING-DYN –

+0

[Итак, у вас есть ответ?] (Http://meta.stackexchange.com/a/5235/169168) –

ответ

0

Попробуйте следующее:

CREATE FUNCTION refresh_view_by_name(view_name text) RETURNS VOID AS $$ 
BEGIN 
    EXECUTE 'REFRESH MATERIALIZED VIEW ' || view_name::regclass; 
END 
$$ LANGUAGE PLPGSQL; 
0

Имя зрения является идентификатором и не является значением. Вы не можете параметризовать его, поэтому вам нужен динамический 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; 

Исправлены некоторые другие ошибки, находясь на нем.
Связанного ответ с более подробным объяснением:

Смежные вопросы