Опростете по подобен начин на това, което сте имали предвид:
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 [ LANGUAGE
lang_name
] code
...lang_name
Името на процедурния език, на който е написан кодът. Ако е изключено, по подразбиране еplpgsql
.