I have the following postgres function
CREATE OR REPLACE FUNCTION refresh_materialized_view(name)
RETURNS integer AS
$BODY$
DECLARE
_table_name ALIAS FOR $1;
_entry materialized_views%ROWTYPE;
_result INT;
BEGIN
SELECT * INTO _entry FROM materialized_views WHERE table_name = _table_name;
BEGIN;
EXECUTE 'CREATE TEMP TABLE new_materialized_view_rows ON COMMIT DROP AS SELECT * FROM ' || _entry.view_name;
EXECUTE 'TRUNCATE TABLE ' || _table_name;
EXECUTE 'INSERT INTO ' || _table_name || ' SELECT * FROM new_materialized_view_rows';
UPDATE materialized_views
SET last_refresh = CURRENT_TIMESTAMP
WHERE table_name = _table_name;
COMMIT;
EXECUTE 'ANALYZE ' || table_name;
RETURN 1;
END
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
ALTER FUNCTION refresh_materialized_view(name) OWNER TO portal;
The function is called from a non-transactional context, so I've enclosed the statements that update data with
BEGIN;
COMMIT;
so that these statements execute atomically. However, when I execute the script above I get the following error:
ERROR: syntax error at or near ";"
LINE 16: BEGIN;