запрос не имеет назначения для данных результатов (RETURNS TRIGGER) - PullRequest
0 голосов
/ 09 мая 2020

У меня проблема, когда при вставке я хочу обновить вместо этого, если идентификатор клиента существует в отдельной таблице с именем leadCustomer. Я получаю сообщение об ошибке в названии и, честно говоря, понятия не имею, почему, если бы кто-нибудь мог дать какой-либо совет, я был бы очень признателен.

CREATE TRIGGER tr_Ins_FlightBooking
BEFORE INSERT ON FlightBooking
FOR EACH ROW EXECUTE PROCEDURE update_Lead();

CREATE OR REPLACE FUNCTION update_Lead()
RETURNS TRIGGER AS 
$BODY$
    BEGIN
      SELECT * FROM FlightBooking, LeadCustomer;
      IF FlightBooking.CustomerID = LeadCustomer.CustomerID
      THEN UPDATE FlightBooking AS fb
      SET NumSeats = OLD + NEW, TotalCost = OLD + NEW
      FROM fb JOIN LeadCustomer AS lc ON
      fb.CustomerID = lc.CustomerID
      WHERE fb.CustomerID != lc.CustomerID;
      END IF;
    END;
$BODY$ 
LANGUAGE plpgsql;

Большое спасибо, Каллум

1 Ответ

1 голос
/ 09 мая 2020

Здесь, кажется, есть несколько довольно фундаментальных ошибок:

  • Как говорится в ошибке, нигде нет результатов вашего SELECT оператора для go.
  • В следующей строке вы получаете доступ к FlightBooking и LeadCustomer, как если бы они были записями или строками; предположительно вы ожидаете, что они будут исходить из SELECT, но какую строку они будут содержать?
  • Позже вы напишете OLD + NEW, но OLD и NEW являются записями - они представляют собой всю строку, запускается триггер, а не какой-либо конкретный столбец.
  • Это INSERT триггер, поэтому нет OLD значений, только вставляются NEW.
  • Вы JOIN LeadCustomer в столбце CustomerID, но эта строка еще не была вставлена, потому что это триггер BEFORE.
  • У вас также есть предложение WHERE, которое противоречит вашему ON предложение, поэтому никакие строки не могут соответствовать (ON fb.CustomerID = lc.CustomerID WHERE fb.CustomerID != lc.CustomerID)
  • Вы не RETURN ничего, чтобы указать, должен ли исходный INSERT быть go впереди или нет.

Если вы посмотрите руководство Postgres для триггеров , вы увидите несколько примеров, и я не хочу писать ваш код для вас, потому что я думаю, что лучше учиться, пытаясь, но вот несколько подсказок:

  • Ваше главное условие - есть ли строка, соответствующая вставке ed CustomerID (что будет в переменной NEW.CustomerID) в таблице LeadCustomer; вы можете использовать запрос IF EXISTS (...), чтобы увидеть, есть ли строка, соответствующая этому условию.
  • В своем обновлении вы хотите добавить значения из NEW (вставленная строка) в существующую строку в стол, а не OLD.
  • Я не думаю, что вам нужен JOIN в этом обновлении, просто чтобы соответствовать WHERE CustomerID = NEW.CustomerID, но я не совсем понимаю, что вы пытаетесь сделать.
  • Если вы запускаете обновление, вы хотите пропустить вставку, поэтому RETURN NULL; если вы не запускаете обновление, вам нужно указать Postgres на go перед вставкой, поэтому RETURN NEW (это объясняется в руководстве).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...