linkend="functions-string">). For example:
-EXECUTE format('UPDATE tbl SET %I = %L WHERE key = %L', colname, newvalue, keyvalue);
+EXECUTE format('UPDATE tbl SET %I = %L '
+ 'WHERE key = %L', colname, newvalue, keyvalue);
+ %I> is equivalent to quote_ident>, and
+ %L> is equivalent to quote_nullable.
The format function can be used in conjunction with
the USING clause:
EXECUTE format('UPDATE tbl SET %I = $1 WHERE key = $2', colname)
USING newvalue, keyvalue;
- This form is more efficient, because the parameters
- newvalue and keyvalue are not
- converted to text.
+ This form is better because the variables are handled in their native
+ data type format, rather than unconditionally converting them to
+ text and quoting them via %L>. It is also more efficient.
-- Now "mviews" 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;
+ EXECUTE format('TRUNCATE TABLE %I', mviews.mv_name);
+ EXECUTE format('INSERT INTO %I %s', mviews.mv_name, mviews.mv_query);
END LOOP;
RAISE NOTICE 'Done refreshing materialized views.';
from one run to the next (see ),
and it also means that variable substitution is not done on the
command string. As with EXECUTE, parameter values
- can be inserted into the dynamic command via USING>.
+ can be inserted into the dynamic command via
+ format()> and USING>.
The SCROLL> and
NO SCROLL> options have the same meanings as for a bound
cursor.
An example:
-OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident(tabname)
- || ' WHERE col1 = $1' USING keyvalue;
+OPEN curs1 FOR EXECUTE format('SELECT * FROM %I WHERE col1 = $1',tabname) USING keyvalue;
- In this example, the table name is inserted into the query textually,
- so use of quote_ident()> is recommended to guard against
- SQL injection. The comparison value for col1> is inserted
- via a USING> parameter, so it needs no quoting.
+ In this example, the table name is inserted into the query via
+ format()>. The comparison value for col1>
+ is inserted via a USING> parameter, so it needs
+ no quoting.