Java:从过程中读取元数据

时间:2010-10-04 10:04:48

标签: java oracle stored-procedures metadata

我正在寻找一种从Oracle存储过程中获取元数据的方法,例如输入/输出参数及其类型。

我确实试过了DESC,但它无效:

stmt = conn.createStatement();
ResultSet rs1 = stmt.executeQuery("desc pack.procname");
while ( rs1.next() ) { 
System.out.println(rs1.getString(1));
}

有关使用什么方法获取输入/输出参数的任何想法?

Thanx你的时间。

4 个答案:

答案 0 :(得分:4)

使用以下代码块来解决问题。

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);
  int    columnPrecision      = rs.getInt(8);
  int    columnByteLength     = rs.getInt(9);
  short  columnScale          = rs.getShort(10);
  short  columnRadix          = rs.getShort(11);
  short  columnNullable       = rs.getShort(12);
  String columnRemarks        = rs.getString(13);

  System.out.println("stored Procedure name="+procedureName);
  System.out.println("procedureCatalog=" + procedureCatalog);
  System.out.println("procedureSchema=" + procedureSchema);
  System.out.println("procedureName=" + procedureName);
  System.out.println("columnName=" + columnName);
  System.out.println("columnReturn=" + columnReturn);
  System.out.println("columnDataType=" + columnDataType);
  System.out.println("columnReturnTypeName=" + columnReturnTypeName);
  System.out.println("columnPrecision=" + columnPrecision);
  System.out.println("columnByteLength=" + columnByteLength);
  System.out.println("columnScale=" + columnScale);
  System.out.println("columnRadix=" + columnRadix);
  System.out.println("columnNullable=" + columnNullable);
  System.out.println("columnRemarks=" + columnRemarks);
}

答案 1 :(得分:3)

由于您使用的是JDBC,我的首选是使用JDBC元数据API来检索此信息,而不是直接查询Oracle数据字典。 DatabaseMetaData.getProcedureColumns是获取过程参数的通用JDBC方法。

答案 2 :(得分:2)

请尝试以下声明:

select *
from user_arguments
where package_name = 'PACK' and object_name = 'PROCNAME';

根据程序包所属的架构,您可能需要使用视图_ALL_ARGUMENTS_或_DBA_ARGUMENTS_。

答案 3 :(得分:0)

如果要避免直接使用JDBC,可以使用我的开源SchemaCrawler API,它可以从数据库元数据创建普通的旧Java对象。