Пользовательская переменная @get_exam_id
, похоже, нигде не имеет значения. Если ему не присвоено значение, отличное от NULL, то результатом оценки этой строки:
set @exam_id = concat( ' and b.exam_ID = " ', @get_exam_id , '"' );
будет то, что @exam_id
будет NULL. И это будет каскадно переходить в следующий CONCAT, который также будет оцениваться как NULL.
Пользовательские переменные начинаются с символа знака @
at.
Это разные и отдельные из аргументов процедуры и переменных, которые не начинаются с символа знака @
at.
Похоже, что, возможно, целью была ссылка на локальную переменную get_exam_id
, а не на определяемую пользователем переменную.
FOLLOWUP
Лично, если бы мне пришлось написать тело процедуры, я бы сделал это примерно так:
DELIMITER $$
CREATE PROCEDURE proc_studymaterial_listing( get_exam_id INT(11))
BEGIN
SET @sql = CONCAT( 'SELECT c.content_type'
,'\n' ,' , c.title'
,'\n' ,' , c.status'
,'\n' ,' , c.created_on'
,'\n' ,' , c.pdf_is_downloadable'
,'\n' ,' , a.content_id'
,'\n' ,' , a.expiry_date'
,'\n' ,' , b.exam_name'
,'\n' ,' , fun_subject_name(a.subject_id) AS subject_name'
,'\n' ,' , fun_subject_name(a.chapter_id) AS chapter_name'
,'\n' ,' FROM tbl_studymaterial_exam_chapter_map a'
,'\n' ,' JOIN tbl_exam_master b'
,'\n' ,' ON b.exam_id = a.exam_id'
,'\n' ,' JOIN tbl_studymaterial c'
,'\n' ,' ON c.id = a.content_id'
,'\n' ,' WHERE c.status = 1'
,'\n'
,CASE
WHEN get_exam_id <> 0
THEN ' AND b.exam_id = ? '
ELSE ''
END
,'\n' ,' ORDER BY subject_name, chapter_name, exam_name'
);
PREPARE stmt FROM @sql;
IF (get_exam_id <> 0) THEN
SET @id = get_exam_id;
EXECUTE stmt USING @id;
SET @id = '';
ELSE
EXECUTE stmt;
END IF;
DEALLOCATE PREPARE stmt;
SET @sql = '';
END;
$$
DELIMITER ;