我有一个存储过程" executeStoredProc"执行另一个存储过程" SP1"。因此,在" executeStoredProc"中创建了一个临时表。然后将SP1的数据提供给临时表,然后检索结果集。但是当我从SQL Server Management Studio执行存储过程时,我得到了结果集,但是当我使用Prepared语句来执行" executeStoredProc"从jdbc我得不到结果集。
所以这里的查询部分是一个类,它给了我所有可以传递给" 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);
答案 0 :(得分:0)
当您使用Statement的execute方法执行给定的SQL语句时,它可能会返回多个结果集和输出参数。在某些情况下,单个SQL语句可能会返回多个结果集和/或更新计数。通常你可以忽略这个,除非你是
- 执行您知道的存储过程可能会返回多个结果。
- 动态执行未知的SQL字符串。
execute方法可以执行SQL语句并返回一个布尔值。当值为true时,从语句返回的第一个结果是结果集。当值为false时,返回的第一个结果是更新计数。然后,您必须使用方法getResultSet或getUpdateCount来检索结果,并使用getMoreResults移动到任何后续结果。
当SQL语句的结果不是结果集时,方法getResultSet将返回null。这可能意味着结果是更新计数或没有更多结果。在这种情况下,找出null真正意味着什么的唯一方法是调用方法getUpdateCount,它将返回一个整数。此整数将是受调用语句影响的行数,或-1表示结果是结果集或没有结果。如果方法getResultSet已经返回null,这意味着结果不是ResultSet对象,则返回值-1必须表示没有更多结果。
如果有人调用方法getResultSet并处理它返回的ResultSet对象,则必须调用方法getMoreResults以查看是否有其他结果集或更新计数。如果getMoreResults返回true,则需要再次调用getResultSet来实际检索下一个结果集。如上所述,如果getResultSet返回null,则必须调用getUpdateCount以确定null是否表示结果是更新计数还是没有更多结果。
CallableStatement cs=null;
ResultSet rs =null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://<server_ip>;databaseName=<dbName>", "<userName>", "<Password>");
cs = con.prepareCall("exec exampleProcedure");
int resultNum = 0;
while (true)
{
boolean queryResult;
int rowsAffected;
if (1 == ++resultNum)
{
try
{
queryResult = cs.execute();
System.out.println("QueryResult:"+queryResult);
}
catch (SQLException e)
{
System.out.println("Result " + resultNum + " is an error: " + e.getMessage());
continue;
}
}
else
{
try
{
queryResult = cs.getMoreResults();
System.out.println("QueryResult:"+queryResult);
}
catch (SQLException e)
{
System.out.println("Result " + resultNum + " is an error: " + e.getMessage());
continue;
}
}
if (queryResult)
{
rs = cs.getResultSet();
System.out.println("Result " + resultNum + " is a ResultSet: " + rs);
//rs.close();
}
else
{
rowsAffected = cs.getUpdateCount();
System.out.println("rowsAffected:"+rowsAffected);
if (-1 == rowsAffected)
{
--resultNum;
break;
}
System.out.println("Result " + resultNum + " is an update count: " + rowsAffected);
}
}
} catch (Exception e) {
e.printStackTrace();
}