#mysql
#mysql
Вопрос:
Я обнаружил, что хранимая процедура не выполняет только эту часть:
SET @sql
= CONCAT('SELECT TraineeID, ', @sql, '
from tbl_submit_coursefee c
where c.BatchID='BID'
group by c.TraineeID');
в предложении where ''
кавычки не разрешены, а запрос без кавычек возвращает пустой, но если я прямо указываю значение параметра в предложении where, то это работает. Я действительно стек с этим.
Вот мой подготовленный оператор (работает нормально):
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT ('MAX(IF(BillNo = ''', BillNo, ''', CRA, NULL)) AS `Inv.', BillNo, '`')
) INTO @sql
FROM tbl_submit_coursefee
WHERE BatchID="ID-Welding/FMMTTC-01M/R8/01";
SET @sql
= CONCAT('SELECT TraineeID, ', @sql, '
from tbl_submit_coursefee c
where c.BatchID="ID-Welding/FMMTTC-01M/R8/01"
group by c.TraineeID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
при помещении этого оператора в хранимую процедуру (не работает):
DELIMITER @@
DROP PROCEDURE GetRetainment @@
CREATE PROCEDURE vtproject.GetRetainment
(IN `BID` VARCHAR(100))
BEGIN
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT ('MAX(IF(BillNo = '', BillNo, '', CRA, NULL)) AS `Inv.', BillNo, '`')
) INTO @sql
FROM tbl_submit_coursefee
WHERE BatchID=BID;
SET @sql
= CONCAT('SELECT TraineeID, ', @sql, '
from tbl_submit_coursefee c
where c.BatchID='BID'
group by c.TraineeID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END @@
DELIMITER ;
Если я select @sql
раньше prepare stmt FROM @sql
затем выводил, как показано ниже:
SELECT TraineeID, MAX(IF(BillNo = 1, CRA, NULL)) AS `Inv.1`,MAX(IF(BillNo = 2, CRA, NULL)) AS `Inv.2`,MAX(IF(BillNo = 3, CRA, NULL)) AS `Inv.3`,MAX(IF(BillNo = 4, CRA, NULL)) AS `Inv.4`,MAX(IF(BillNo = 5, CRA, NULL)) AS `Inv.5`,MAX(IF(BillNo = 6, CRA, NULL)) AS `Inv.6`,MAX(IF(BillNo = 7, CRA, NULL)) AS `Inv.7` from tbl_submit_coursefee c where c.BatchID=BID group by c.TraineeID
Комментарии:
1. то, что выводится
select @sql;
непосредственно передPREPARE stmt FROM @sql;
, я думаю,BID
должно быть таким''BID''
, две двойные кавычки означают, что вы используете его как escape-символ2.
''BID''
двойные кавычки еще не взяты, и я просто обновляю то, что возвращаю, если я установилselect @sql
раньшеprepare stmt From @sql
. пожалуйста, взгляните.3. если я использую «BID», mysql возвращает пустой результат
4. Что это за
BID
какая-то переменная илиValue
?5. «ID-Welding/FMMTTC-01M / R8/01»
Ответ №1:
вам нужно экранировать кавычки, вот так :
SET @sql
= CONCAT('SELECT TraineeID, ', @sql, '
from tbl_submit_coursefee c
where c.BatchID=''',BID,'''
group by c.TraineeID');
согласно документу:http://dev.mysql.com/doc/refman/5.7/en/string-literals.html
Комментарии:
1. таким образом, запрос выполняется хорошо, но как только он выполняется,
''' ,BID, ''';
измените на'' ,BID, '';
, наконец, это не будет выполняться дальше.
Ответ №2:
Я сам нашел решение другим способом.
BEGIN
SET @sql = NULL;
SET @bid=BID;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT ('MAX(IF(BillNo = ', BillNo, ', CRA, NULL)) AS `Inv.', BillNo, '`')
) INTO @sql
FROM tbl_submit_coursefee
WHERE BatchID=@bid;
SET @sql
= CONCAT('SELECT TraineeID, ', @sql, '
from tbl_submit_coursefee c
where c.BatchID=@bid
group by c.TraineeID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END