Могу ли я использовать 2 таблицы в одной хранимой процедуре - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь написать хранимую процедуру, в которой я использую 2 таблицы для извлечения данных на основе условия, но выдает ошибку.

Мой SP:

DELIMITER //
CREATE PROCEDURE select_notifications(IN datePosted DATETIME,IN recipientId INT,IN packageId INT,IN accountId INT)
BEGIN
 IF datePosted < NOW() THEN
  SELECT tn.subject_line,tn.message,tn.message_type FROM track_notifications AS tn WHERE tn.package_id=packageId AND tn.recipient_id=recipientId AND tn.account_id=accountId AND tn.date_posted = datePosted;
 ELSE IF datePosted > NOW()
  SELECT subject_line,message,message_type FROM track_notifications_new WHERE package_id=packageId AND recipient_id=recipientId AND account_id=accountId AND date_posted = datePosted;
 END IF;
END
END //

Mysql Ошибка:

Следующий запрос не выполнен: "CREATE DEFINER = root @ localhost PROCEDURE select_track_notifications (IN datePosted DATETIME, IN recipientId INT, IN packageId INT, IN accountId INT) НЕ ДЕТЕРМИНИСТИЧЕСКОЕ СОДЕРЖИТ ОПРЕДЕЛИТЕЛЬ БЕЗОПАСНОСТИ SQL SQL, ЕСЛИ datePosted NOW () THEN SELECT subject_nE, FROMидентификатор_пакета = идентификатор_пакета И идентификатор получателя = идентификатор_пользователя И идентификатор_счета = идентификатор_приложения И дата_поставлено = датаПоставлено; КОНЕЦ ЕСЛИ; * КОНЕЦ "

MySQL сказал:

Любая помощь?Спасибо.

1 Ответ

0 голосов
/ 12 октября 2018
  • У вас есть дополнительные END в конце вашего заявления.
  • Кроме того, вам нужно будет сбросить разделитель на ; в конце.
  • Иначеесли синтаксис ELSEIF .... THEN (без пробела между ELSE и IF).
  • Кроме того, я думаю, что вам может понадобиться использовать предложение SELECT .. INTO для хранения результатов вашего запроса select в переменных(на котором вы будете выполнять дальнейшие действия).

Попробуйте вместо этого следующее:

DELIMITER //
DROP PROCEDURE IF EXISTS select_notifications //
CREATE PROCEDURE select_notifications(IN datePosted DATETIME,
                                      IN recipientId INT,
                                      IN packageId INT,
                                      IN accountId INT)
BEGIN
 IF datePosted < NOW() THEN
  SELECT tn.subject_line,
         tn.message,
         tn.message_type 
  FROM track_notifications AS tn 
  WHERE tn.package_id=packageId AND 
        tn.recipient_id=recipientId AND 
        tn.account_id=accountId AND 
        tn.date_posted = datePosted;

 ELSEIF datePosted > NOW() THEN 
  SELECT subject_line,
         message,
         message_type 
  FROM track_notifications_new 
  WHERE package_id=packageId AND 
        recipient_id=recipientId AND 
        account_id=accountId AND 
        date_posted = datePosted;
 END IF;
END //

DELIMITER ;
...