如何通过 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 java.lang.ClassNotFoundException: com.informix.jdbc.IfxDirectConnection