обработка нулевых параметров в процедуре MySQL - не работает - PullRequest
0 голосов
/ 01 октября 2010

Я передаю нулевую процедуру ниже, так как ниже она не возвращает никаких значений, даже если данные есть в таблице?

вызов view_ads (NULL, «транспортные средства», 9);

call view_ads ('placename', null, 9);

=============================================== ======================================

ниже код

delimiter $$
drop procedure view_ads$$
create procedure view_ads (place_name varchar(200),category_name varchar(200),pagecount int(8))
begin
declare lowerval int(8);
declare higherval int(8);
set lowerval= pagecount-9;
set higherval=pagecount;
if isnull(place_name) then

SET @sql = CONCAT( "select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='N' and ( category ='",category_name,"' or subcategory='",category_name,"')
union all
select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='Y' and  ( category ='",category_name,"' or subcategory='",category_name,"')
order by automated asc,posteddate  desc
limit ",lowerval,",",higherval)
;
elseif ISNULL(category_name) then
SET @sql = CONCAT( "select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='N' and ( state ='",place_name,"' or city='",place_name,"')
union all
select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='Y' and  ( state ='",place_name,"' or city='",place_name,"')
order by automated asc,posteddate  desc
limit ",lowerval,",",higherval)
;
else
SET @sql = CONCAT( "select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='N' and ( state ='",place_name,"' or city='",place_name,"') and  ( category ='",category_name,"' or subcategory='",category_name,"')
union all
select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='Y' and  ( state ='",place_name,"' or city='",place_name,"') and  ( category ='",category_name,"' or subcategory='",category_name,"')
order by automated asc,posteddate  desc
limit ",lowerval,",",higherval)
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; 
end if;
end$$

1 Ответ

0 голосов
/ 01 октября 2010

Попробуйте сравнить с пустой строкой, примерно так:

delimiter $$
drop procedure view_ads$$
create procedure view_ads (place_name varchar(200),category_name varchar(200),pagecount int(8))
begin
declare lowerval int(8);
declare higherval int(8);
set lowerval= pagecount-9;
set higherval=pagecount;

if place_name = '' then
SET @condition = CONCAT("and ( category ='",category_name,"' or subcategory='",category_name,"')");
else if category_name = '' then
SET @condition = CONCAT("( state ='",place_name,"' or city='",place_name,"')");
else
SET @condition = CONCAT("( state ='",place_name,"' or city='",place_name,"') and  ( category ='",category_name,"' or subcategory='",category_name,"')");

SET @SQL = CONCAT( "select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='N' ",condition,"
union all
select idads_list,category,subcategory,state,city,title,
      title_decode,phonenumber,userid,description,DATE_FORMAT(ad_date,'%d-%M-%Y %H:%i:%s') posteddate,automated
       from ads_list
where automated='Y' ",condition,"
order by automated asc,posteddate  desc
limit ",lowerval,",",higherval)
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; 
end if;
end$$

Также я немного изменил вашу процедуру, чтобы она была короче.

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