Java 如何在下面提到的场景中将列表传递给sql查询
我必须将列表传递给用户选择的存储过程。 这个列表在java末尾是一个字符串。 示例:Java 如何在下面提到的场景中将列表传递给sql查询,java,sql,sql-server,select,plsql,Java,Sql,Sql Server,Select,Plsql,我必须将列表传递给用户选择的存储过程。 这个列表在java末尾是一个字符串。 示例:String list=“123467980” 现在,若我把这个字符串按原样放到存储过程中,那个么它将如何工作呢 我不能按以下方式使用它: select * from table_name where code in (list_var) 因此,有谁能告诉我,实现此功能的最佳方法是什么。在客户端编写SQL: String sql = "select * from table_name where code in
String list=“123467980”代码>
现在,若我把这个字符串按原样放到存储过程中,那个么它将如何工作呢
我不能按以下方式使用它:
select * from table_name where code in (list_var)
因此,有谁能告诉我,实现此功能的最佳方法是什么。在客户端编写SQL:
String sql = "select * from table_name where code in (" + list_var + ")";
或者,如果您想调用存储过程,那么哪些实际参数应该是列表中表示的字符串:
String [] ids = list.split(",");
String sql = "{call yourProcedure(";
for(int i = 0; i < ids.length; i++)
sql += (i == 0?"":",") + "?";
sql += ")}";
CallableStatement cst = con.prepareCall(sql);
for(int i = 0; i < ids.length; i++)
cst.setInt(i+1, Integer.parseInt(ids[i]));
如果您想使用表值参数,也可以使用类似于此处的字符串拆分函数:您已经提供了三个答案。第二个是好的。第一个和第三个选项有SQL注入的风险。@DavidWallace您是对的,尽管OP没有指定列表
是否是收集用户提供的原始输入的结果,这可能会导致您提到的两个答案出现危险的SQL注入情况,或者如果它是由他/她的程序间接组成的。后一种情况,SQL注入不可能。
String sql = "{call yourProcedure(" + list + ")}";
CallableStatement cst = con.prepareCall(sql);