1

我在 Informix 中创建了一个表:

create table tab_unmrow
(
   area integer,
   rectangle row(
            x integer,
            y integer,
            length integer,
            width integer)
);

现在,当我select first 1 * from tab_unmrow使用时dbaccess,它工作正常。但是在使用时isql,我收到了这个错误:

1820: Host variable type has been changed between fetches or puts.
Error in line 1

有人可以建议我如何解决这个问题以及为什么会出现这个问题。

4

1 回答 1

0

除了向 IBM 报告错误外,您可能无法直接对此做任何事情。

最终,在 ESQL/C 中存在一个错误,即 CQ idsdb00247065,它给出了错误 -1820。除非将 LVARCHAR 变量的大小设置为原始大小,否则在重新打开游标时不能对 LVARCHAR 变量重用 SQL 描述符。这很烦人,因为改变大小的是 ESQL/C 本身。

应用程序可以使用一种解决方法,即存储每个 LVARCHAR 的原始大小,并在第一个 FETCH 之前(实际上是在 OPEN 之后)在 SQL 描述符中恢复该大小。但这需要 ISQL 的源代码。此问题与 LVARCHAR 相关,即使在您显示的 SQL 中没有直接提及它,因为 Informix SQL ( isql) 和 DB-Access ( dbaccess) 等客户端程序处理复杂类型(例如 ROW 类型)的方式是将LVARCHAR 的值。

该修复将需要 (a) Informix ClientSDK (CSDK) 的固定版本和 (b) 使用固定 CSDK 构建的 ISQL 版本。

在短期内,您将不得不使用 DB-Access 而不是 ISQL 来处理 SQL 脚本,因为您说 DB-Access 可以处理它。尽管 DB-Access 是 20 年前从 ISQL 中分离出来的,但从那时起它们就独立开发了。

如果这个诊断有缺陷,那就是它适用于 SQL 描述符,而不是sqlda结构(你不需要了解细节;处理动态 SQL 的机制只有两种,错误报告严格适用于一个, 但可能适用于另一个,因为它可能isql使用sqlda而不是 SQL 描述符)。然而,这两个问题很有可能是密切相关的,即使它不是很明确。

于 2013-03-14T17:08:39.823 回答