вернуть null в mysql процедуре с запросом Dynami c - PullRequest
0 голосов
/ 07 мая 2020

может кто-нибудь, пожалуйста, скажите мне, чего мне не хватает. Я потратил 4 часа и смотрю много статей, не могу понять, почему отображается return null

mysql mysql процедура выглядит следующим образом.

create  procedure proc_studymaterial_listing(
    get_exam_id int(11)
)
begin
    set @query1 = concat( "select c.content_type, 
                                  c.title, 
                                  c.status, 
                                  c.created_on, 
                                  c.pdf_is_downloadable, 
                                  a.content_id, 
                                  a.expiry_date, 
                                  exam_Name,  
                                  fun_subject_name(a.subject_id) as subject_name, 
                                  fun_subject_name(a.chapter_id) as chapter_name
                           from  tbl_studymaterial_exam_chapter_map as a 
                           join tbl_exam_master as b on a.exam_id= b.exam_ID
                           join tbl_studymaterial as c on c.id= a.content_id  
                           where c.status=1 " );

    if( get_exam_id = 0 ) 
    then
        set @exam_id = " and 1=1 ";
    else
        set @exam_id = concat( ' and  b.exam_ID = " ', @get_exam_id , '"' );
    end if;     

    SET @final_query =  CONCAT ( @query1,@exam_id );    

    PREPARE stmt FROM @final_query ; 
    # select stmt; 
    # EXECUTE stmt;
    #  DEALLOCATE PREPARE stmt;

end;

1 Ответ

1 голос
/ 07 мая 2020

Пользовательская переменная @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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...