Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在下面提到的场景中将列表传递给sql查询_Java_Sql_Sql Server_Select_Plsql - Fatal编程技术网

Java 如何在下面提到的场景中将列表传递给sql查询

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

我必须将列表传递给用户选择的存储过程。 这个列表在java末尾是一个字符串。 示例:
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);