如何获取自定义 Oracle 函数参数定义

Posted

技术标签:

【中文标题】如何获取自定义 Oracle 函数参数定义【英文标题】:How to get a custom Oracle function parameter definition 【发布时间】:2021-05-10 05:40:18 【问题描述】:

我们需要从 Java jdbc 中获取自定义函数参数列表。

我们在名为 mypkg 的包中定义自定义函数。

我使用 oracle 作为数据库。

我们可以在控制台中运行 desc mypkg.customFunction 之类的命令。

但我想知道如何从 java 端获取类似信息。

【问题讨论】:

@Abra 我正在使用 oracle。 您能否提供代码 sn-ps,以便更清楚您正在努力解决的问题? 【参考方案1】:

如果您有存储函数(而不是存储过程),则方法 getFunctionColumns 将检索其参数的详细信息。

考虑以下代码(使用try-with-resources)。

请注意,Oracle 的 JDBC 驱动程序中似乎有一个 bug,其中方法 getFunctionColumns 多次检索相同的参数。下面的代码只会显示每个参数的详细信息一次。

代码后有更多解释。

String url = "jdbc:oracle...";
try (Connection conn = DriverManager.getConnection(url)) 
    DatabaseMetaData dbmd = conn.getMetaData();
    ResultSet rs = dbmd.getFunctionColumns("mypkg", "<schema>", "customFunction", "%");
    String lastColumn = null;
    while (rs.next()) 
        String columnName = rs.getString(4);
        if (columnName != null  &&  !columnName.equals(lastColumn)) 
            String type;
            switch (rs.getShort(5))  // parameter type (IN, OUT or IN-OUT)
                case DatabaseMetaData.functionColumnIn:
                    type = "IN";
                    break;
                case DatabaseMetaData.functionColumnInOut:
                    type = "IN OUT";
                    break;
                case DatabaseMetaData.functionColumnOut:
                    type = "OUT";
                    break;
                default:
                    type = "unknown";
            
            System.out.printf("%s %s %s%n",
                              rs.getString(4),  // parameter name
                              type,             // parameter type
                              rs.getString(7)); // data type length
            lastColumn = columnName;
        
    

catch (SQLException xSql) 
    xSql.printStackTrace();

我假设您知道连接到 Oracle 数据库所需的 JDBC 连接 URL。 调用方法 getFunctionColumns 的第一个参数是 PL/SQL 包名称。 调用方法getFunctionColumns 的第二个参数是模式。将上述代码中的&lt;schema&gt; 替换为mypkg 的所有者的实际模式名称。如果您不知道架构,则可以使用 null。方法 getFunctionColumns 返回的 ResultSet 的第 2 列包含架构名称。 如果customFunction是一个存储过程(而不是一个存储函数),那么你需要方法getProcedureColumns

【讨论】:

以上是关于如何获取自定义 Oracle 函数参数定义的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scikit-learn 中使用管道调整自定义内核函数的参数

在Delphi中如何使用SQL自定义函数,参数怎样传递给自定义函数?

php - 获取函数参数的个数以及自定义打印函数

为啥 C++ 从 C# 中为返回自定义结构的函数获取错误的参数值

oracle自定义函数

如何将 :new 作为参数传递给 oracle 客户函数?