3

在 oracle 中,我可以获得存储过程的元数据:

 DatabaseMetaData dbMetaData = conn.getMetaData();
 ResultSet rs = dbMetaData.getProcedureColumns(conn.getCatalog(),
                          null,
                          "procedureNamePattern",
                          "columnNamePattern");

  while(rs.next()) {
      // get stored procedure metadata
      String procedureCatalog     = rs.getString(1);
      String procedureSchema      = rs.getString(2);
      String procedureName        = rs.getString(3);
      String columnName           = rs.getString(4);
      short  columnReturn         = rs.getShort(5);
      int    columnDataType       = rs.getInt(6);
      String columnReturnTypeName = rs.getString(7);
  }

但是没有数据返回函数:

DatabaseMetaData.getFunctionColumns()

如何获取 oracle 函数的元数据

4

2 回答 2

1

出了点问题,艾略特弗里施

对于不同的商店/功能,它总是返回相同的结果:

目录名称 = ,架构名称 = ,表名称 = ,列名称 = PROCEDURE_CAT,列标签 = PROCEDURE_CAT,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = PROCEDURE_SCHEM,列标签 = PROCEDURE_SCHEM,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = PROCEDURE_NAME,列标签 = PROCEDURE_NAME,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = COLUMN_NAME,列标签 = COLUMN_NAME,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = COLUMN_TYPE,列标签 = COLUMN_TYPE,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = DATA_TYPE,列标签 = DATA_TYPE,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = TYPE_NAME,列标签 = TYPE_NAME,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = PRECISION,列标签 = PRECISION,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = LENGTH,列标签 = LENGTH,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = SCALE,列标签 = SCALE,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = RADIX,列标签 = RADIX,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = NULLABLE,列标签 = NULLABLE,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = REMARKS,列标签 = REMARKS,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = SEQUENCE,列标签 = SEQUENCE,列数据类型 = 2,列类名称 = java.math.BigDecimal,列返回类型名称 = NUM​​BER

目录名称 = ,架构名称 = ,表名称 = ,列名称 = OVERLOAD,列标签 = OVERLOAD,列数据类型 = 12,列类名称 = java.lang.String,列返回类型名称 = VARCHAR2

目录名称 = ,架构名称 = ,表名称 = ,列名称 = DEFAULT_VALUE,列标签 = DEFAULT_VALUE,列数据类型 = -1,列类名称 = java.lang.String,列返回类型名称 = LONG

于 2014-06-13T06:46:37.763 回答
1

这不好,但我为我工作:

select ARGUMENT_NAME, DATA_TYPE, IN_OUT from SYS.ALL_ARGUMENTS where object_name = upper(?) order by position as

然后在java中,我可以得到

String columnName = rs.getString("ARGUMENT_NAME");
if (index == 0) {
    columnName = RETURN_VALUE;
}
String columnDataTypeInString = rs.getString("DATA_TYPE");
String columnReturnInString = rs.getString("IN_OUT");
于 2014-06-13T08:05:50.367 回答