如何通过 JDBC 显示 Informix sysprocedures.paramtypes 列?

Posted

技术标签:

【中文标题】如何通过 JDBC 显示 Informix sysprocedures.paramtypes 列?【英文标题】:How to show Informix sysprocedures.paramtypes column via JDBC? 【发布时间】:2013-02-01 08:27:42 【问题描述】:

我在通过本机 JDBC 驱动程序执行 SQL 查询时遇到问题。我的程序使用此查询来生成 Informix 数据库模式的报告:http://code.activestate.com/recipes/576621-dump-informix-schema-to-text/

SELECT procname, numargs, isproc, paramtypes, variant, handlesnulls, parallelizable
FROM sysprocedures
WHERE internal='f' AND mode IN ('D', 'd', 'O', 'o')
ORDER BY procname, numargs, procid

当我使用 ODBC 时它可以工作,但是这个程序可以由 Jython 和 JDBC 运行,并且在 JDBC 中我得到了异常:

Dla tego typu danych jest wymagana dostosowana mapa typów. [SQLCode: -79769], [SQLState: IX000]

英文翻译(我讨厌本地语言中的JDBC错误描述,它们只会在您在网络中搜索解决方案时造成麻烦):

-79769 A customized type map is required for this data type
Explanation: You must register a customized type map to use any opaque types.

我也简单试过:

SELECT * FROM sysprocedures

但这在 JDBC 中也不起作用。

我发现paramtypes 是个问题:如果我删除它,查询就可以工作。

我必须注册什么才能将此列映射到 JDBC 可以显示的内容?

【问题讨论】:

【参考方案1】:

paramtypes 列是一种复杂的列类型,是使用 Informix 的一些可扩展性特性创建的。我怀疑 ODBC 驱动程序通过执行以下操作来解决它:

SELECT procname, numargs, isproc, paramtypes::LVARCHAR, variant, handlesnulls, parallelizable
  FROM sysprocedures
 WHERE internal = 'f' AND mode IN ('D', 'd', 'O', 'o')
 ORDER BY procname, numargs, procid

也就是说,它强制转换为字符串。当我运行查询(在我的 SQLCMD 中)时,我得到了输出,但是很多 procnames 是空字符串。我不太确定那里发生了什么。

【讨论】:

投射到LVARCHAR 有效!我试过VARCHAR 但没有成功。现在它返回像“integer,integer,varchar”这样的字符串。谢谢!【参考方案2】:

与其使用参数类型的非规范化版本,不如加入

SELECT p.*, c.*, informix.schema_coltypename(c.paramtype, c.paramxid)
FROM sysprocedures p
JOIN sysproccolumns c ON p.procid = c.procid
WHERE p.internal='f' AND p.mode IN ('D', 'd', 'O', 'o')
ORDER BY p.procname, p.numargs, p.procid, c.paramid

【讨论】:

以上是关于如何通过 JDBC 显示 Informix sysprocedures.paramtypes 列?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 使用 informix 的 genxmlquery 功能?

我可以将锁定模式设置为在 Informix - JDBC - tomcat 连接池中等待吗?

如何查看连接到 Informix 数据库的应用程序名称?

Informix java.lang.ClassNotFoundException: com.informix.jdbc.IfxDirectConnection

基于 Informix JDBC 的 SSL 在 JBOSS 7 下不起作用

使用 Dataframes 从 Informix 到 Spark 的 JDBC