簡體   English   中英

如何在MySQL中准備和執行多個語句?

[英]How to prepare and execute multiple statements in MySQL?

我在MySQL數據庫上有一個存儲過程,用於更新記錄。 根據輸入,或者將小時添加到列中,或者減去小時到列中。 我使用Appian智能服務進行存儲過程調用此SP。 我的問題是,如果嘗試同時進行加和減(對於不同的行),則存儲過程將不執行任何操作。 它可以在我的流程模型中正常運行,但數據庫未更新。 如果我僅使用一個輸入(加法或減法)運行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

尚不清楚,因為您尚未提供過程參數聲明,但是我猜addAttendeeUsernameremoveAttendeeUsername是字符串。 但是,您不要在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的變量),而不是局部變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM