多个过程签名时使用 Java 获取 Oracle 过程元数据
Fetch Oracle procedure metadata with Java when multiple procedure signatures
我们有一个带有多个过程签名的 Oracle 数据库。它们每个都有 6 个参数,但在签名的每个变体中,最后一个参数是不同的类型。
例如,在一个变体中,最后一个参数是一个 clob,在另一个变体中,它是一个 varchar。
在我们执行过程之前,我们查找过程的列
rs = conn.getMetaData().getProcedureColumns(packageName, schema, procedureName, "%");
此调用总是 returns 只是过程的一种表示形式的列。这是有问题的,因为我们在执行之前使用该响应中的列最终将我们的参数加载到可调用语句中。我们这样做是为了获得参数范围(输入、return 等)。如果元数据提取提取了最后一个参数是字符串的变体,但我们实际上试图用 clob 执行那个变体,那么它会出错,因为它试图执行过程的错误变体。
如果您不反对使用 oracle 数据字典,您可以像这样获取所有 procedure/column 元数据:
select * from all_arguments
where user = '<your schema>'
and package_name = '<you rpackage>'
and object_name = '<your procedure>'
order by subprogram_id, position
我们有一个带有多个过程签名的 Oracle 数据库。它们每个都有 6 个参数,但在签名的每个变体中,最后一个参数是不同的类型。
例如,在一个变体中,最后一个参数是一个 clob,在另一个变体中,它是一个 varchar。
在我们执行过程之前,我们查找过程的列
rs = conn.getMetaData().getProcedureColumns(packageName, schema, procedureName, "%");
此调用总是 returns 只是过程的一种表示形式的列。这是有问题的,因为我们在执行之前使用该响应中的列最终将我们的参数加载到可调用语句中。我们这样做是为了获得参数范围(输入、return 等)。如果元数据提取提取了最后一个参数是字符串的变体,但我们实际上试图用 clob 执行那个变体,那么它会出错,因为它试图执行过程的错误变体。
如果您不反对使用 oracle 数据字典,您可以像这样获取所有 procedure/column 元数据:
select * from all_arguments
where user = '<your schema>'
and package_name = '<you rpackage>'
and object_name = '<your procedure>'
order by subprogram_id, position