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;
您需要对过程