我有一个执行另一个存储过程“SP1”的存储过程“executeStoredProc”。因此,在“executeStoredProc”中创建了一个临时表,然后将SP1的数据提供给临时表,然后检索结果集。但是当我从SQL Server Management Studio执行存储过程时,我得到了结果集,但是当我使用Prepared语句从jdbc执行“executeStoredProc”时,我没有得到结果集。声明不返回结果集SQL Server例外
所以这里的查询部分是一个类,它给了我所有可以传递给“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)发布重现错误的最简单存储过程的代码。 –