我在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
有人可以建议我如何解决这个问题,为什么会出现这个问题。
答案 0 :(得分:0)
除了向IBM报告错误之外,您可能无法直接对其进行任何操作。
最终,ESQL / C中存在一个错误,CQ ID idsdb00247065,它给出了错误-1820。 除非将LVARCHAR变量的大小设置为原始大小,否则在重新打开游标时,不能将SQL描述符重用于LVARCHAR变量。这令人恼火,因为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描述符)。但是,这两个问题很有可能是密切相关的,即使它不是很明显。