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排序,以及參數在過程定義中出現的順序。」 –