Проблема с синтаксисом на Postgresql

На постгри только начала работать. Борюсь с синтаксисом. Пишу запрос ниже

DO $$
declare 
        v_class_code varchar(12);
        v_class_name varchar(128);
        v_firms_id  varchar(12) ;
        v_right_flags int ;
begin
    update quik.classes 
    set class_name = 'Test'
    where id = 1
    returning class_code, class_name, firms_id, right_flags into v_class_code, v_class_name, v_firms_id, v_right_flags;

     select v_class_code, v_class_name, v_firms_id, v_right_flags
end;
$$ LANGUAGE plpgsql;

Выдается ошибка ERROR: syntax error at end of input LINE 15: $$ LANGUAGE plpgsql; ^ SQL state: 42601 Character: 376

Что не так?


Ответы (1 шт):

Автор решения: Akina
  1. Язык обычно указывается в начале, а не в конце. Анонимный блок - это не процедура. Впрочем, так можно, это не ошибка.
  2. Зачем нужны переменные и RETURNING, если результат нигде не будет использован?
  3. То же самое - о финальном недописанном SELECT. Да и в принципе SELECT в выходной поток в анонимном блоке - не бывает.
CREATE TABLE classes (
  class_code  VARCHAR(12),
  class_name VARCHAR(128),
  firms_id VARCHAR(12),
  right_flags INT,
  id INT
);
INSERT INTO classes VALUES
('code 1', 'class name 1', 'firm 1', 1, 1),
('code 2', 'class name 2', 'firm 2', 2, 2),
('code 3', 'class name 3', 'firm 3', 3, 3);
DO $$
/*
  declare 
        v_class_code varchar(12);
        v_class_name varchar(128);
        v_firms_id  varchar(12) ;
        v_right_flags int ;
  */
begin
   update classes 
   set class_name = 'Test'
   where id = 1
/*   returning class_code, class_name, firms_id, right_flags into v_class_code, v_class_name, v_firms_id, v_right_flags */ ;

--   select v_class_code, v_class_name, v_firms_id, v_right_flags
end
$$ LANGUAGE plpgsql;
SELECT * FROM classes;
class_code class_name firms_id right_flags id
code 2 class name 2 firm 2 2 2
code 3 class name 3 firm 3 3 3
code 1 Test firm 1 1 1

fiddle

→ Ссылка