Это слишком долго для комментария.
Декларация cursor_name numeric;
не имеет для меня никакого смысла. Если вам нужен курсор (который здесь, кажется, не нужен для начала), вы должны объявить его как cursor
, а не numeric
. Вы также никогда не открываете курсор для начала. И DBMS_SQL.PARSE
не является стандартной функцией Postgres, похоже, вы пытаетесь перенести некоторый код Oracle.
Вы также ссылаетесь на переменную t_msg
, которую вы не объявили. Но сообщение об ошибке текущей ошибки автоматически доступно в переменной SQLERRM
Существует также ( документировано ) SQLSTATE 50001 в Postgres, поэтому я не уверен, какую ошибку вы хотите отлавливать там.
Насколько я могу судить, ваш код можно упростить до:
DO $$
declare
t_ord text;
begin
-- no need for a SELECT to assign a variable
t_ord := 'REVOKE role_test FROM test';
raise notice 't_ord %', t_ord;
EXECUTE t_ord;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE '%', SQLERRM;
END;
$$;
Для начала вам не нужен динамический SQL, но я предполагаю, что вы упростили ваш пример. Чтобы сгенерировать правильный оператор REVOKE в блоке PL / pgSQL, вы должны использовать format
для правильной обработки идентификаторов в операторах SQL, например, при условии, что у вас есть переменные с именами t_role_name
и t_user_name
, вы должны использовать что-то вроде:
t_ord := format('REVOKE %I FROM %I', t_role_name, t_user_name);