diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 0fe6bcf..9a44767 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -2304,25 +2304,25 @@ END LOOP <optional> <replaceable>label</replaceable> </optional>;
      resulting from the <replaceable>query</replaceable> and the loop body is
      executed for each row. Here is an example:
 <programlisting>
-CREATE FUNCTION cs_refresh_mviews() RETURNS integer AS $$
+CREATE OR REPLACE FUNCTION cs_refresh_mviews() RETURNS integer AS $$
 DECLARE
-    mviews RECORD;
+    mview RECORD;
+    refresh_count INT := 0;
 BEGIN
     RAISE NOTICE 'Refreshing materialized views...';
 
-    FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP
+    FOR mview IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP
 
-        -- Now "mviews" has one record from cs_materialized_views
+        -- Now "mview" has one record from cs_materialized_views
 
-        RAISE NOTICE 'Refreshing materialized view %s ...', quote_ident(mviews.mv_name);
-        EXECUTE 'TRUNCATE TABLE ' || quote_ident(mviews.mv_name);
-        EXECUTE 'INSERT INTO '
-                   || quote_ident(mviews.mv_name) || ' '
-                   || mviews.mv_query;
+        RAISE NOTICE 'Refreshing materialized view % ...', quote_ident(mview.mv_name);
+        EXECUTE 'REFRESH MATERIALIZED VIEW ' || quote_ident(mview.mv_name);
+
+        refresh_count := refresh_count + 1;
     END LOOP;
 
     RAISE NOTICE 'Done refreshing materialized views.';
-    RETURN 1;
+    RETURN refresh_count;
 END;
 $$ LANGUAGE plpgsql;
 </programlisting>
