2012-02-14 13 views
0

ストアドプロシージャとしては、これはかなり簡単に行うことができますが、そのようにはなりません。 2つの入力: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のSPROCのテーブル名に変数を使用](http://stackoverflow.com/questions/2754423/use-の可能な複製を使用して処理することができますa-variable-for-mysql-sproc) –

+0

リンクマイケルに感謝します。 – user1185787

答えて

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インジェクション攻撃を防ぐことができます。スペースを

  • フィールド名はバッククォート `

関連する問題