2

我使用的DatabaseMetaData获得SQL服务器上的存储过程的列(读参数):DatabaseMetaData getProcedureColumns存储过程列名称的顺序?

Connection connection = getConnection(); //getting the connection - 
DatabaseMetaData dbMetaData = connection.getMetaData(); 

HashMap<String, Integer> paramInfo = new HashMap<String, Integer>(); 
if (dbMetaData != null){ 
    ResultSet rs = dbMetaData.getProcedureColumns (null, null, sp_name.toUpperCase(), "%"); 
    while (rs.next()) 
     paramInfo.put(rs.getString(4), rs.getInt(6)); 
    rs.close(); 
} 

是否getProcedureColumns()有序的方式返回程序列?意思是如果在数据库中存储过程参数是-abc(@a int,@b int,@c int),我是否总是按顺序获得@a, @b and @c

如果是,是否有任何文档建议相同?

回答

2

所有的JDBC驱动程序都必须遵循JDBC规范和API文档,以及DatabaseMetaData.getProcedureColumns API文档中规定:

获取给定类别的存储过程 参数和结果列的描述。

仅返回符合架构,过程和参数名称 标准的描述。它们按PROCEDURE_CAT, PROCEDURE_SCHEM,PROCEDURE_NAMESPECIFIC_NAME的顺序排列。在此范围内, 返回值(如果有)是第一个。接下来是呼叫顺序中的参数 说明。列说明在列号 号码顺序中。

如果驱动程序不遵循此规范,那么这是驱动程序中的错误。所以一般来说你应该可以依靠上面的描述。否则,请检查指定类型(参数,结果集列等)和描述位置(检查javadoc中的细节)的(索引18)的列COLUMN_TYPE(索引5)中的值。

+1

此外,SQLServerDatabaseMetaData#getProcedureColumns源代码显示它调用SQL Server系统存储过程'sp_sproc_columns',其[documentation](https://docs.microsoft.com/en-us/sql/relational- database/system-stored-procedures/sp-sproc-columns-transact-sql)表示:“返回的结果由PROCEDURE_QUALIFIER,PROCEDURE_OWNER,PROCEDURE_NAME排序,以及参数在过程定义中出现的顺序。” –