【踩坑】存储过程入参为NULL 报错

自己写了个存储过程代码如下

CREATE DEFINER=`pan`@`%` PROCEDURE `get_app_page_by_condition`(
	IN `key_word` VARCHAR ( 20 ),
	IN `category_name_id` BIGINT,
	IN `developer_id` BIGINT,
	IN `is_enable` TINYINT,
	IN `is_inverted` TINYINT,
	IN `tag` VARCHAR ( 20 ),
	IN `start_num` INT,
	IN `page_size` INT 
	)
BEGIN#Routine body goes here...
	DECLARE
		cate_lv INT;
	SELECT
		lv INTO cate_lv 
	FROM
		category_name 
	WHERE
		id = category_name_id;
	
	select developer_id;
	
		SET @keyword_condition = NULL;
		SET @category_condition = NULL;
		SET @developer_id_condition = NULL;
		SET @is_enable_condition = NULL;
		SET @is_inverted_condition = NULL;
		SET @tag_condition = NULL;
		SET @page_condition = NULL;
	
	SET @base_result_sql = '	SELECT   app.id,
            app_name,

            av.id as app_version_id,
            av.app_id,
            av.version_name,
            av.create_time as app_version_create_time,
            av.file_size,
            av.download_url,
            av.remark,

            img_url,
            introduction,
            tag,
            download_times,

            d.id AS developer_id,
            developer_name,
            address,
            tel,
            email,
            d.create_time as developer_create_time,

            is_enable,
            is_inverted,
            app.update_time,
            app.create_time from app 
						LEFT JOIN app_version AS av ON av.id=app.app_version_id
						LEFT JOIN developer AS d ON d.id = app.developer_id';
	SELECT  @base_result_sql;
		
		
	IF
		cate_lv = 0 THEN
			
			SET @category_condition = CONCAT( ' WHERE app.id in (select app_id from category_app where category_lv_id in(select id from category_lv WHERE root_category_id=', category_name_id, '))' );
		
		ELSEIF cate_lv = 1 THEN
		
		SET @category_condition = CONCAT( ' WHERE app.id in (select app_id from category_app where category_lv_id in(select id from category_lv WHERE primary_category_id=', category_name_id, '))' );
		
		ELSEIF cate_lv = 2 THEN
		
		SET @category_condition = CONCAT( ' WHERE app.id in (select app_id from category_app where category_lv_id in(select id from category_lv WHERE secondary_category_id=', category_name_id, '))' );
		
		ELSEIF cate_lv = 3 THEN
		
		SET @category_condition = CONCAT( ' WHERE app.id in (select app_id from category_app where category_lv_id in(select id from category_lv WHERE tertiary_category_id=', category_name_id, '))' );
		
	END IF;
	SELECT
		@category_condition;
	IF
		key_word IS NOT NULL THEN
			
			SET @keyword_condition = CONCAT( ' AND app.app_name LIKE \"%', key_word, '%\"' );
-- 		SELECT
-- 			@keyword_condition;
		
	END IF;
	IF
		developer_id IS NOT NULL THEN
			
			SET @developer_id_condition = CONCAT( ' AND app.developer_id=', developer_id );
			
	ELSE
			SELECT 'ok';
	END IF;
			SELECT
			@developer_id_condition;
	
	IF
		is_enable IS NOT NULL THEN
			
			SET @is_enable_condition = CONCAT( ' AND app.is_enable=', is_enable );
-- 		SELECT
-- 			@is_enable_condition;
		
	END IF;
	IF
		is_inverted IS NOT NULL THEN
			
			SET @is_inverted_condition = CONCAT( ' AND app.is_inverted=', is_inverted );
-- 		SELECT
-- 			@is_inverted_condition;
		
	END IF;
	IF
		tag IS NOT NULL THEN
			
			SET @tag_condition = CONCAT( ' AND app.tag="', tag, '"' );
-- 		SELECT
-- 			@tag_condition;
		
	END IF;
	IF
		start_num IS NOT NULL 
		AND page_size IS NOT NULL THEN
			
			SET @page_condition = CONCAT( ' limit ', start_num, ',', page_size );
-- 		SELECT
-- 			@page_condition;
		
	END IF;
	
-- 	SET @finalSql=CONCAT(@base_result_sql,NULL);
	
	SET @finalSql = CONCAT( @base_result_sql, 
	@category_condition,
		@keyword_condition,
		@developer_id_condition,
		@is_enable_condition,
		@is_inverted_condition,
		@tag_condition,
		@page_condition
	);
	SELECT
		@finalSql;
	PREPARE stmt 
	FROM
		@finalSql;
	EXECUTE stmt;
	DEALLOCATE PREPARE stmt;

END

当CALL get_app_page_by_condition ('百度',130,NULL,0,0,'0',1,10); 

sql报错

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1, Time: 0.011000s

@finalSql返回的也是(NULL) 字符串拼接失败
 

看了这个报错 一直以为是CALL get_app_page_by_condition ('百度',130,NULL,0,0,'0',1,10); 这句代码出错啦!!!

网上查存储过程入参为NULL报错 一直没有答案

结果多方排查才发现 是由于在存储过程中调用了CONCAT(str1,str2)函数

当时CONCAT("123",NULL)时 就会报错!!! 该函数无法接收NULL

将代码中CONCAT的参数改为'' 空字符串 就解决问题了

	SET @keyword_condition = '';
	SET @category_condition = '';
	SET @developer_id_condition = '';
        SET @is_enable_condition = '';
 	SET @is_inverted_condition = '';
 	SET @tag_condition = '';
 	SET @page_condition = '';

这个问题困扰了好久 在此挖坑

===========总结==============

最后发现

方法1:如果没有定义全局变量@sql

SELECT @sql 默认为NULL

SELECT CONCAT('123',@sql) 返回为 NULL

方法2:定义全局变量@sql=NULL

SET @sql = NULL;

SELECT CONCAT('123',@sql) 返回为NULL

方法2:定义全局变量@sql=''

SET @sql='';

SELECT CONCAT('123',@sql)成功 为123

猜你喜欢

转载自blog.csdn.net/mmlik8878/article/details/86627239