【发布时间】:2017-08-05 02:55:31
【问题描述】:
我正在尝试使用 mysql 数据库中的存储过程构建动态查询,但仍然看到此错误。为什么?
1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在第 7 行的 '' 附近使用的正确语法
DROP PROCEDURE IF EXISTS mp_test;
CREATE PROCEDURE mp_test(
IN PrStatus VARCHAR(255),
IN PrStatusCode VARCHAR(255),
IN PrProviderId VARCHAR(255),
IN PrRow VARCHAR(255))
BEGIN
SET @Condition = '';
SET @Query = '
SELECT
bitauth_users.fullname,
tbservices.ServiceNameAR,
tbservices.ServiceNameEN,
tbservices.ServiceId,
globrx.ProviderId,
globrx.RequestDesc,
TbServicesRequestsLog.status
FROM tbservices, Tbservicesrequests globrx,
TbServicesRequestsLog, bitauth_users
WHERE globrx.ProviderId = 'Prproviderid' ';
IF PrStatus != '' THEN
SET @Condition = CONCAT(' AND globrx.RequestId = TbServicesRequestsLog.RequestId');
SET @Condition = CONCAT(' AND globrx.ServiceId = tbservices.ServiceId');
SET @Condition = CONCAT(' AND bitauth_users.user_id = globrx.ReceiverId');
SET @Condition = CONCAT(' AND globrx.RequestId = TbServicesRequestsLog.RequestId');
SET @Condition = CONCAT('AND (SELECT status FROM TbServicesRequestsLog,Tbservicesrequests AS subrx
WHERE subrx.RequestId = TbServicesRequestsLog.RequestId
AND subrx.ServiceId = globrx.ServiceId
ORDER BY RequestLogId DESC LIMIT 1)"', status_code, '"');
SET @Condition = CONCAT('GROUP BY TbServices.ServiceId ORDER BY TbServices.ServiceId ASC LIMIT 'PrRow',10')
END IF;
SET @Query = CONCAT(@Query, @Condition);
PREPARE stmt FROM @Query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
【问题讨论】:
-
WHERE globrx.ProviderId = 'Prproviderid' '行似乎不对。 MySQL 不是 php,它不会在字符串中扩展变量。您需要使用concat()。另外,你的分隔符声明在哪里? -
你的意思是使用 concat 和 @Query var ?
-
是的,我愿意。但比尔也在他的回答中指出了这一点。
-
好的,我试过了,但没有修复错误
-
我已经删除了我的答案。我不喜欢因为我的努力而遭到反对。
标签: mysql stored-procedures mariadb