Java: чтение метаданных из процедуры - PullRequest
1 голос
/ 04 октября 2010

Я ищу способ получения метаданных из процедуры хранилища Oracle, таких как параметры ввода / вывода и их типы.

Я попробовал DESC, но он не работает:

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

Есть идеи, какой подход использовать для получения параметров ввода / вывода?

Спасибо за ваше время.

Ответы [ 4 ]

4 голосов
/ 27 октября 2011

Используйте приведенный ниже блок кода для решения проблемы.

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);
}
3 голосов
/ 04 октября 2010

Поскольку вы используете JDBC, я бы предпочел использовать API метаданных JDBC для получения этой информации, а не напрямую запрашивать словарь данных Oracle. DatabaseMetaData.getProcedureColumns - это общий метод JDBC для получения параметров процедуры.

2 голосов
/ 04 октября 2010

Попробуйте следующее утверждение:

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

В зависимости от схемы, к которой принадлежит пакет, вам может потребоваться вместо этого использовать _ALL_ARGUMENTS_ или _DBA_ARGUMENTS_.

0 голосов
/ 03 февраля 2011

Если вы хотите избежать непосредственного использования JDBC, вы можете использовать мой открытый код SchemaCrawler API, который создает простые старые объекты Java из метаданных базы данных.

...