Как подготовить и выполнить несколько операторов в MySQL? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть хранимая процедура в базе данных MySQL, которую я использую для обновления своих записей.На основе входных данных либо добавьте часы в столбец, либо вычтите часы из столбца.Я называю этот SP, используя умный сервис Appian для процедур магазина.Моя проблема в том, что если попытаться сделать и сложение, и вычитание (для разных строк), то процедура сохранения ничего не делает.Он работает в моей модели процесса нормально, но БД не обновляется.Если я запускаю PM только с одним входом (либо с добавлением, либо с вычитанием), он соответствующим образом обновляет БД.Может кто-нибудь сказать мне, что я делаю неправильно в моем SP?Примечание: входы addAttendeeUsername и removeAttendeeUsername - это строки VARCHAR, разделенные запятыми

    BEGIN

    DECLARE startTime datetime;
    DECLARE SQLStateCode varchar(5) DEFAULT '00000';
    DECLARE ErrorNumber int;
    DECLARE MessageText varchar(1000);

    -- insert / update

    set @sql = concat("UPDATE
      XCS_APP_CERTIFICATION
    SET
      COMPLETED_HOURS = COMPLETED_HOURS + ", courseHours , ",
      LAST_MODIFIED_BY = '", lastModifiedBy, "',
      LAST_MODIFIED_ON = NOW()
    WHERE
    XCS_APP_CERTIFICATION.CREATED_BY in (" , addAttendeeUsername , ") AND VALID_START_DATE <= '", offeringEndDateTime, "'
      AND GRACE_PER_END_DATE >= '", offeringEndDateTime,"' ");


    set @sql2 = concat("UPDATE
      XCS_APP_CERTIFICATION
    SET
      COMPLETED_HOURS = COMPLETED_HOURS - ", courseHours, ",
      LAST_MODIFIED_BY = '", lastModifiedBy, "',
      LAST_MODIFIED_ON = NOW()
    WHERE
      CREATED_BY IN (", removeAttendeeUsername, ")  AND VALID_START_DATE <= '", offeringEndDateTime, "'
      AND GRACE_PER_END_DATE >= '", offeringEndDateTime, "' ");

        PREPARE stmt FROM @sql;
        EXECUTE stmt;


        PREPARE stmt2 FROM @sql2;
        EXECUTE stmt2;

    set successFlag = 1;

    -- committing transaction
    COMMIT;

    END

1 Ответ

0 голосов
/ 12 февраля 2019

Непонятно, потому что вы не предоставили объявление аргумента процедуры, но я бы предположил, что addAttendeeUsername и removeAttendeeUsername являются строками.Но вы не используете кавычки вокруг них в своем синтаксисе SQL.Таким образом, они будут интерпретироваться как имена столбцов, которые, без сомнения, не найдены.

Вы действительно должны комбинировать входные переменные, используя параметры запроса, а НЕ объединять их в свой SQL.

set @sql = concat("UPDATE
  XCS_APP_CERTIFICATION
SET
  COMPLETED_HOURS = COMPLETED_HOURS + ?
  LAST_MODIFIED_BY = ?,
  LAST_MODIFIED_ON = NOW()
WHERE
XCS_APP_CERTIFICATION.CREATED_BY in (?) AND VALID_START_DATE <= ?
  AND GRACE_PER_END_DATE >= ? ");

SET @courseHours = courseHours, 
    @lastModifiedBy = lastModifiedBy,
    @addAttendeeUsername = addAttendeeUsername,
    @offeringEndDateTime = offeringEndDateTime;

PREPARE stmt FROM @sql;
EXECUTE stmt USING @courseHours, @lastModifiedBy,@addAttendeeUsername, 
  @offeringEndDateTime, @offeringEndDateTime;

Когда вы EXECUTE, вы должны использовать переменные сеанса (типа с @ sigil), а не локальные переменные.

...