自己写了个存储过程代码如下
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