在Mysql存储过程中,我试图插入一个不在任何表中的额外参数


In Mysql stored procedure I am trying to insert an extra parameter which is not in any table

DROP PROCEDURE `spGetUserLog1`//
CREATE DEFINER=`xxx`@`xxxxx` PROCEDURE `spGetUserLog1`(
        IN sUsername VARCHAR(9), IN dtFrom DATETIME, IN dtTo DATETIME,  
    IN OFFSET SMALLINT(1), IN ROWCOUNT SMALLINT(1), IN iGMT VARCHAR(50))
BEGIN
    DECLARE UId, SR, R, MR, D SMALLINT(1);
    DECLARE G,iGMT VARCHAR(50);
    SELECT UserId, SubReseller, Reseller, MainReseller, Distributor,GMT
    INTO UId, SR, R, MR, D ,G
    FROM Customers WHERE Username=sUsername LIMIT 1;
    CASE
    WHEN D !=0 THEN
        SET @Query = "SELECT Username, Sender, Mobile, 
        Type,
        CASE
        WHEN Type = 'TEXT' OR Type = 'FLASH' THEN
            Message
        WHEN Type = 'UNICODE' OR Type = 'UNICODE-FLASH' THEN
            CONVERT( UNHEX(Message) USING utf8)
        ELSE
            Message
        END AS Message, Length, MessageId,
        IFNULL((SELECT Status FROM DLRStatus WHERE MessageId = a.MessageId),IF((DATE(SentAt)=CURRENT_DATE),'ENQUEUE','ACCEPTD')) as Status,
        CONVERT_TZ(SentAt,iGMT,G)FROM SmscLog a WHERE Username IN( SELECT Username FROM Customers WHERE DistributorId = ? ) 
        AND DATE(SentAt) BETWEEN ? AND ? ORDER BY SentAt DESC";
        SET @DistributorId = UId;
        SET @SentFrom = dtFrom;
        SET @SentTo = dtTo;
        SET @Lim = CONCAT(' LIMIT ', OFFSET, ROWCOUNT);
        SET @Query = CONCAT(@Query, @Lim);
        PREPARE Stmt FROM @Query;
        EXECUTE Stmt USING @DistributorId, @SentFrom, @SentTo;
        DEALLOCATE PREPARE Stmt;
    WHEN MR !=0 THEN
        SET @Query = "SELECT Username, Sender, Mobile, 
        Type,
        CASE
        WHEN Type = 'TEXT' OR Type = 'FLASH' THEN
            Message
        WHEN Type = 'UNICODE' OR Type = 'UNICODE-FLASH' THEN
            CONVERT( UNHEX(Message) USING utf8)
        ELSE
            Message
        END AS Message, Length, MessageId,
        IFNULL((SELECT Status FROM DLRStatus WHERE MessageId = a.MessageId),IF((DATE(SentAt)=CURRENT_DATE),'ENQUEUE','ACCEPTD')) as Status,
        CONVERT_TZ(SentAt,iGMT,G) FROM SmscLog a WHERE Username IN  ( SELECT Username FROM Customers WHERE MainResellerId = ? ) 
        AND DATE(SentAt) BETWEEN ? AND ? ORDER BY SentAt DESC";

  SET @MainResellerId = UId;
        SET @SentFrom = dtFrom;
        SET @SentTo = dtTo;
        SET @Lim = CONCAT(' LIMIT ', OFFSET, ',', ROWCOUNT);
        SET @Query = CONCAT(@Query, @Lim);
        PREPARE Stmt FROM @Query;
        EXECUTE Stmt USING @MainResellerId, @SentFrom, @SentTo;
        DEALLOCATE PREPARE Stmt;
    WHEN R !=0 THEN
        SET @Query = "SELECT Username, Sender, Mobile, 
        Type,
        CASE
        WHEN Type = 'TEXT' OR Type = 'FLASH' THEN
            Message
        WHEN Type = 'UNICODE' OR Type = 'UNICODE-FLASH' THEN
            CONVERT( UNHEX(Message) USING utf8)
        ELSE
            Message
        END AS Message, Length, MessageId,
        IFNULL((SELECT Status FROM DLRStatus WHERE MessageId = a.MessageId),IF((DATE(SentAt)=CURRENT_DATE),'ENQUEUE','ACCEPTD')) as Status,
        CONVERT_TZ(SentAt,iGMT,G) FROM SmscLog a WHERE Username IN ( SELECT Username FROM Customers WHERE ResellerId = ? ) 
        AND DATE(SentAt) BETWEEN ? AND ? ORDER BY SentAt DESC";

        SET @ResellerId = UId;
        SET @SentFrom = dtFrom;
        SET @SentTo = dtTo;
        SET @Lim = CONCAT(' LIMIT ', OFFSET, ',', ROWCOUNT);
        SET @Query = CONCAT(@Query, @Lim);
        PREPARE Stmt FROM @Query;
        EXECUTE Stmt USING @ResellerId, @SentFrom, @SentTo;
        DEALLOCATE PREPARE Stmt;
    WHEN SR !=0 THEN
        SET @Query = "SELECT Username, Sender, Mobile, 
        Type,
        CASE
        WHEN Type = 'TEXT' OR Type = 'FLASH' THEN
            Message
        WHEN Type = 'UNICODE' OR Type = 'UNICODE-FLASH' THEN
            CONVERT( UNHEX(Message) USING utf8)
        ELSE
            Message
        END AS Message, Length, MessageId,
        IFNULL((SELECT Status FROM DLRStatus WHERE MessageId = a.MessageId),IF((DATE(SentAt)=CURRENT_DATE),'ENQUEUE','ACCEPTD')) as Status,
        CONVERT_TZ(SentAt,iGMT,G) FROM SmscLog a WHERE Username IN ( SELECT Username FROM Customers WHERE SubResellerId = ? ) 
        AND DATE(SentAt) BETWEEN ? AND ? ORDER BY SentAt DESC";

        SET @SubResellerId = UId;
        SET @SentFrom = dtFrom;
        SET @SentTo = dtTo;
        SET @Lim = CONCAT(' LIMIT ', OFFSET, ',', ROWCOUNT);
        SET @Query = CONCAT(@Query, @Lim);
        PREPARE Stmt FROM @Query;
        EXECUTE Stmt USING  @SubResellerId, @SentFrom, @SentTo;
        DEALLOCATE PREPARE Stmt;
    ELSE
        SET @Query = "SELECT Username, Sender, Mobile, 
        Type,
        CASE 
        WHEN Type = 'TEXT' OR Type = 'FLASH' THEN
            Message
        WHEN Type = 'UNICODE' OR Type = 'UNICODE-FLASH' THEN
            CONVERT( UNHEX(Message) USING utf8)
        ELSE
            Message
        END AS Message, Length, MessageId,
        IFNULL((SELECT Status FROM DLRStatus WHERE MessageId = a.MessageId),IF((DATE(SentAt)=CURRENT_DATE),'ENQUEUE','ACCEPTD')) AS Status,
        CONVERT_TZ(SentAt,iGMT,G) FROM SmscLog a WHERE Username = ? 
        AND DATE(SentAt) BETWEEN ? AND ? ORDER BY SentAt DESC";

        SET @Username = sUsername;
        SET @SentFrom = dtFrom;
        SET @SentTo = dtTo;
        SET @Lim = CONCAT(' LIMIT ', OFFSET, ',', ROWCOUNT);
        SET @Query = CONCAT(@Query, @Lim);
        PREPARE Stmt FROM @Query;
        EXECUTE Stmt USING @Username, @SentFrom, @SentTo;
        DEALLOCATE PREPARE Stmt;
    END CASE;
END

在这里,我传递的IGMT是在php页面中使用我们的日期函数计算的,我希望这个值在存储过程中使用。

但是当我在php页面上执行时,我得到一个错误:

存储过程中未定义变量IGMT .

是否有办法在这个存储过程中传递这个值?

您正在过程中构建一个sql语句,然后准备并执行它。问题是您在准备好的查询中使用了文本"iGMT",而不是变量包含的值。

您需要将其替换为占位符(?),并将iGMT参数传递给execute语句。例如,第一个查询将变成

SET @Query = "SELECT Username, Sender, Mobile, 
        Type,
        CASE
        WHEN Type = 'TEXT' OR Type = 'FLASH' THEN
            Message
        WHEN Type = 'UNICODE' OR Type = 'UNICODE-FLASH' THEN
            CONVERT( UNHEX(Message) USING utf8)
        ELSE
            Message
        END AS Message, Length, MessageId,
        IFNULL((SELECT Status FROM DLRStatus WHERE MessageId = a.MessageId),IF((DATE(SentAt)=CURRENT_DATE),'ENQUEUE','ACCEPTD')) as Status,
        CONVERT_TZ(SentAt,?,G) FROM SmscLog a WHERE Username IN ( SELECT Username FROM Customers WHERE ResellerId = ? ) 
        AND DATE(SentAt) BETWEEN ? AND ? ORDER BY SentAt DESC";
SET @DistributorId = UId;
SET @SentFrom = dtFrom;
SET @SentTo = dtTo;
SET @Lim = CONCAT(' LIMIT ', OFFSET, ROWCOUNT);
SET @Query = CONCAT(@Query, @Lim);
PREPARE Stmt FROM @Query;
EXECUTE Stmt USING @iGMT, @DistributorId, @SentFrom, @SentTo;

您需要对过程

中的每个语句进行此更改