Как передать параметр в хранимую процедуру кросс-таблицы - PullRequest
0 голосов
/ 19 марта 2020

Это мой запрос:

CREATE DEFINER=`multicahaya`@`%` PROCEDURE `crosstonnercabang`(
IN in_cabang varchar(5)
)
BEGIN 
#SET GLOBAL group_concat_max_len = 1000000;
SET group_concat_max_len = 8192;
#SET SESSION group_concat_max_len = 1000000000;
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when tonner = ''',
tonner,
''' then vol_sub else 0 end) AS ',
tonner
)
) INTO @sql
FROM t1pkbtm_;

SET @sql = CONCAT('SELECT bln_pkb,cabang,warna,gol,pkb, ', @sql, ', sum(vol_sub) as `count`
FROM t1pkbtm_ where cabang=',in_cabang,' 
GROUP BY pkb ORDER BY bln_pkb,pkb,warna');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END 

Но он показывает ошибку:

1054 - Неизвестный столбец «bt» в «выражении where» ---- crosstonnercabang («bt») )

Я не знаю, как передать параметры в сводный запрос.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Вот правильный ответ:

CREATE DEFINER=`root`@`%` PROCEDURE `crosstonnercabang`(
IN in_cabang varchar(5)
)
BEGIN 
#SET GLOBAL group_concat_max_len = 1000000;
SET group_concat_max_len = 8192;
#SET SESSION group_concat_max_len = 1000000000;
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when tonner = ''',
tonner,
''' then vol_sub else 0 end) AS ',
tonner
)
) INTO @sql
FROM t1pkbtm_;

SET @sql = CONCAT('SELECT bln_pkb,cabang,warna,gol,pkb, ', @sql, ', sum(vol_sub) as `count`
FROM t1pkbtm_ where cabang=\'',in_cabang,'\' 
GROUP BY pkb ORDER BY bln_pkb,pkb,warna');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END
0 голосов
/ 19 марта 2020

Вы должны использовать заполнитель в запросе для параметра. Это безопаснее, потому что защищает от инъекций SQL. Размещение дополнительных кавычек вокруг переменной при объединении не будет работать, если значение содержит кавычки.

@cabang = in_cabang;
SET @sql = CONCAT('SELECT bln_pkb,cabang,warna,gol,pkb, ', @sql, ', sum(vol_sub) as `count`
FROM t1pkbtm_ where cabang= ? 
GROUP BY pkb ORDER BY bln_pkb,pkb,warna');
PREPARE stmt FROM @sql;
EXECUTE stmt USING @cabang;

Обратите внимание, что переменные, используемые в EXECUTE stmt USING, должны быть переменными сеанса, поэтому вам нужно присвоить in_cabang для @cabang.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...