2012-02-14 85 views
0

作爲存儲過程,這應該相當容易,但它並不是這種方式。兩個輸入:cname(概念名稱,概念表)和vname(變量或列名稱,評級表)。 cname輸入工作的很好,但是當我輸入vname時,我所得到的就是輸入文本。因此,如果我「調用enc2.sptest('jello','dwb');」我會找回所有帶有'jello'(cname)這個詞的東西,但是我不會回到'dwb'(vname)這個列中的值。 MySQL可以接受列名輸入嗎?有解決方法嗎?在存儲過程中調用列名稱

drop procedure if exists enc2.sptest; 
delimiter $$ 
create procedure enc2.sptest (in cname varchar(1000),in vname text) 
begin 
select 
a.concept_id 
,a.concept_name 
,b.vname 
from enc2.concept a,enc2.ratings b 
where a.concept_name like concat('%',cname,'%') 
and vname is not null 
and a.concept_id=b.concept_id 
order by vname asc; 
end 
+0

的[使用表名稱的變量在MySQL存儲過程]可能重複(http://stackoverflow.com/questions/2754423/use- a-variable-for-table-name-in-mysql-sproc) – 2012-02-14 18:04:11

+0

感謝您的鏈接邁克爾,解決了它。 – user1185787 2012-02-14 21:20:20

回答

0

如果有人想知道答案,我相信您需要手動創建查詢並從預備好的語句執行它,如下所示。

drop procedure if exists enc2.sptest; 
delimiter $$ 
create procedure enc2.sptest (in cname varchar(1000),in vname text) 
begin 
    set @query = CONCAT(' ', 
    ' select ', 
    ' a.concept_id ', 
    ' ,a.concept_name ', 
    ' ,b.`' , vname , '` ', 
    ' from concept a,ratings b ', 
    ' where a.concept_name like ? ', 
    ' and `', vname , '` is not null ', 
    ' and a.concept_id=b.concept_id ', 
    ' order by `', vname, '` asc; ', 
    ' '); 
    -- select @query; 
    set @cname = concat('%',cname,'%'); 
    prepare statement from @query; 
    execute statement using @cname; 
    deallocate prepare statement; 
end 
$$ 

有這樣的事情需要擔心,比如SQL注入攻擊和帶空格的列名。如果你使用的參數在SQL查詢(與價值的聲明由「○」表示由參數在執行語句時所提供的),可以防止

  • SQL注入攻擊。

  • 用空格字段名稱可以使用反引號`處理