Как выбрать несколько переменных внутри триггерной функции? - PullRequest
0 голосов
/ 10 января 2019

Вот чего я бы хотел достичь:

CREATE FUNCTION f() RETURNS trigger AS $$
  BEGIN
    SELECT COUNT(*) AS total_num, SUM(width) AS total_width
    FROM some_table WHERE foo = NEW.foo;
    IF total_num > 0 AND total_width > 100
    THEN
      RAISE EXCEPTION 'this is bad';
    END IF;
    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;

Но это еще не синтаксически правильно.

Я прочитал, что сначала мне нужно DECLARE переменных (в данном случае total_num и total_width), чтобы я мог использовать их и использовать SELECT INTO, но я видел примеры с одной переменной / SELECT только заявление. Что если у меня их будет больше?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете перечислить несколько переменных в части into. А секция declare должна предшествовать первой begin:

CREATE FUNCTION f() RETURNS trigger 
AS $$
declare
  total_num bigint;
  total_width bigint;
BEGIN
   SELECT COUNT(*), SUM(width)
       into total_num, total_width
   FROM some_table 
   WHERE foo = NEW.foo;

   IF total_num > 0 AND total_width > 100 THEN
      RAISE EXCEPTION 'this is bad';
   END IF;
   RETURN NEW;
END;
$$ LANGUAGE plpgsql;
0 голосов
/ 10 января 2019

Редактировать: я не уверен, что акцент здесь делается на использовании переменных или фактических IF. Это означает ответ на последний вопрос:


Вы можете сделать это без переменных, используя HAVING и EXISTS.

IF EXISTS (SELECT ''
                  FROM some_table
                  WHERE foo = new.foo
                  HAVING count(*) > 0
                         AND sum(width) > 100) THEN
  RAISE EXCEPTION 'this is bad';
END IF;
...