【发布时间】:2016-01-16 17:21:40
【问题描述】:
我有一个存储过程“executeStoredProc”,它执行另一个存储过程“SP1”。因此,在“executeStoredProc”中创建了一个临时表,然后将 SP1 的数据馈送到临时表,然后检索结果集。但是当我从 SQL Server Management Studio 执行存储过程时,我得到了结果集,但是当我使用 Prepared 语句从 jdbc 执行“executeStoredProc”时,我没有得到结果集。
所以这里的查询部分是一个类,它提供了我可以传递给“executeStoredProc”的所有参数。当我执行这个过程时,我得到一个错误,该语句没有返回结果集。
我正在使用 JDBC 来运行该过程。
QueryPart queryPart = new QueryPart(query);
String storedProcedureName = queryPart.getFrom();
String groupByParameters = queryPart.getGroup();
String orderByParameters = queryPart.getOrder();
String nullString = null;
String whereClauseParameters = null;
if(queryPart.getWhere()!=null){
whereClauseParameters = queryPart.getWhere();
}else{
whereClauseParameters = nullString;
}
String parametersOfSP = parameter;
String selectParameterList = null;
String aliasParameterList = null;
CallableStatement callableStatement = null;
PreparedStatement pStatement = null;
StringBuffer storedProcedureExecutionStatement = new StringBuffer();
StringBuffer parameters = new StringBuffer();
if(parametersOfSP !=null){
String[] parameterStringArray = parametersOfSP.split(",");
for(int i=0;i<parameterStringArray.length;i++){
if(parameterStringArray[i].contains("=")){
parameters.append(parameterStringArray[i].split("=")[1]+",");
}else{
parameters.append(parameterStringArray[i]+",");
}
}
}
if (parameters.toString().endsWith(",")) {
parametersOfSP = parameters.toString().substring(0, parameters.length()-1);
}else{
parametersOfSP = nullString;
}
StringBuffer selectedParameter = new StringBuffer();
StringBuffer aliasParameter = new StringBuffer();
String selectParameterStringStatement = query.split("From")[0].split("Select")[1];
String[] selectParams = selectParameterStringStatement.split(",");
for(int i=0;i<selectParams.length;i++){
selectedParameter.append(selectParams[i].split("AS")[0]+",");
aliasParameter.append(selectParams[i].split("AS")[1]+",");
}
if (selectedParameter.toString().endsWith(",")) {
selectParameterList = selectedParameter.toString().substring(0, selectedParameter.length()-1);
}
if (aliasParameter.toString().endsWith(",")) {
aliasParameterList = aliasParameter.toString().substring(0, aliasParameter.length()-1);
}
storedProcedureExecutionStatement.append("EXEC "+ ApplicationProperties.getValue("app.aspose.wrapperStoredProcName")
+" @pi_sp_name ='"+ storedProcedureName +"',@pi_sp_params ='"+parametersOfSP+"'");
storedProcedureExecutionStatement.append(",@pi_col_names = '"+ selectParameterList+"'");
storedProcedureExecutionStatement.append(",@pi_col_aliases = '"+ aliasParameterList+"'");
if(whereClauseParameters!=null){
storedProcedureExecutionStatement.append(",@pi_where_cls = '"+whereClauseParameters+"'");
}else{
storedProcedureExecutionStatement.append(",@pi_where_cls = "+nullString);
}
if(groupByParameters!=null){
storedProcedureExecutionStatement.append(",@pi_group_by_cls = '"+groupByParameters+"'");
}else{
storedProcedureExecutionStatement.append(",@pi_group_by_cls = "+nullString);
}
if(orderByParameters!=null){
storedProcedureExecutionStatement.append(",@pi_order_by_cls = '"+orderByParameters+"'");
}else{
storedProcedureExecutionStatement.append(",@pi_order_by_cls = "+nullString);
}
pStatement = conn.prepareStatement(storedProcedureExecutionStatement.toString());
//rset = (ResultSet)
pStatement.execute();
crs = new CachedRowSetImpl();
crs.populate(rset);
【问题讨论】:
-
请将代码简化为基本的 JDBC,不要进行当前正在执行的字符串操作,这样会更容易理解。最后我还看到了一些时髦的东西:你使用
execute(),然后用似乎在任何地方都没有定义的ResultSet填充CachedRowSet。但是,最可能的原因是执行了一个在结果集之前产生结果计数的存储过程。您可能想尝试在存储过程的开头添加SET NOCOUNT ON。 -
好吧,我在 SP 的开头添加了 SET NOCOUNT ON 但这似乎没有增加任何价值。
-
那么请 1) 将您的代码减少到重现错误所需的绝对最小值,并 2) 发布重现错误的最简单存储过程的代码。
标签: java sql-server stored-procedures jdbc