Опростете по подобен начин на това, което сте имали предвид:
DO
$do$
BEGIN
IF NOT EXISTS (
SELECT FROM pg_catalog.pg_roles -- SELECT list can be empty for this
WHERE rolname = 'my_user') THEN
CREATE ROLE my_user LOGIN PASSWORD 'my_password';
END IF;
END
$do$;
(На основата на отговора на @a_horse_with_no_name и подобрено с коментара на @Gregory.)
За разлика, например, с CREATE TABLE няма IF NOT EXISTS клауза за CREATE ROLE (до поне стр. 12). И тине може изпълнява динамични DDL изрази в обикновен SQL.
Вашата заявка за "избягване на PL/pgSQL" е невъзможна, освен чрез използване на друг PL. DO изразът използва plpgsql като процедурен език по подразбиране. Синтаксисът позволява да се пропусне изричната декларация:
DO [ LANGUAGElang_name] code
...lang_name
Името на процедурния език, на който е написан кодът. Ако е изключено, по подразбиране еplpgsql.