【问题标题】:isql not working with complex row typeisql 不适用于复杂的行类型
【发布时间】:2013-03-14 10:37:47
【问题描述】:

我在 Informix 中创建了一个表:

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

现在,当我使用 dbaccess 执行 select first 1 * from tab_unmrow 时,效果很好。 但是当使用isql 时,我得到了这个错误:

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

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

【问题讨论】:

    标签: sql informix


    【解决方案1】:

    除了将错误报告给 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 type) 是将值转换为 LVARCHAR。

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多