【问题标题】:JDBC getmetadata of an oracle procedure inside package in a schema架构中包内的 Oracle 过程的 JDBC getmetadata
【发布时间】:2015-10-12 17:23:27
【问题描述】:

在 oracle 数据库中有一个模式。在模式内部有一个包含不同方法的包。如何使用DatabaseMetaDataclass中的getProcedureColumn()函数检索过程的元数据?

我尝试使用getProcedureColumns(catalog,schemaname,procedurename,columnnamepattern) 获取元数据,当过程位于架构内时它可以正常工作。当过程位于模式中的包内时,它不会检索。

【问题讨论】:

  • 嗯,你试过什么?
  • 试试这个代码。 OracleDataSource ods = new OracleDataSource(); ods.setURL(DB_URL); ods.setUser(DB_USERNAME); ods.setPassword(DB_PASSWORD); OracleConnection 连接 = (OracleConnection) ods.getConnection(); DatabaseMetaData dbmd = connection.getMetaData(); System.out.println("驱动名称:" + dbmd.getDriverName()); System.out.println("驱动版本:" + dbmd.getDriverVersion());
  • @OldProgrammer:我添加了我试过的吃。如果有人建议获取位于架构中包内的过程的元数据,这将很有帮助
  • 我不确定 JDBC 如何公开元数据,但在 Oracle 数据字典中,包内的过程不是“对象”。我认为这部分是因为参数重载,这意味着一个包可以有多个同名的过程。

标签: database oracle stored-procedures jdbc metadata


【解决方案1】:

这将打印出包中特定过程的所有列信息。用实际值更改参数。

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

            Connection conn =
              DriverManager.getConnection ("jdbc:oracle:thin:@<server>:<port>:<sid>", "<username>", "<password>");

            DatabaseMetaData metadata = conn.getMetaData();

            String packageName = "<your package name>";
            String schemaName = "<schema name>";
            String procedureName = "<procedure name>";

            ResultSet rs = metadata.getProcedureColumns(
                        packageName,
                        schemaName,
                        procedureName,
                    "%");

                while(rs.next()) {
                // get stored procedure metadata
                String procedureCatalog     = rs.getString(1);
                String procedureSchema      = rs.getString(2);
                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);
                }

【讨论】:

  • 非常感谢。这段代码运行良好。在 oracle 文档中,他们提到第一个参数是目录名称。如果 Schema 位于目录内,是否会出现任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2019-05-01
  • 1970-01-01
  • 2012-09-05
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多