作为存储过程,这应该是相当容易的,但它不是那样的。两个输入: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 :(得分: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注入攻击。
可以使用反引号“