Solución al error 528 en Informix – Maximum output rowsize (32767) exceeded

En mi trabajo actual utilizan el gestor de Base de Datos de Informix para algunos de los sistemas en los que desarrollamos, y es aquí donde me encontré una vez con un error como el siguiente al ejecutar una consulta:

 [Error Code: -528, SQL State: IX000]  Maximum output rowsize (32767) exceeded.

El problema es que la documentación de Informix tanto oficial como de los propios usuarios suele estar en su mayoría en Inglés y a veces aunque uno entienda el idioma de Shakespeare también suele haber muchas preguntas en foros sin respuestas que lo dejan a uno más frustrado que al principio. Es por eso que escribo el post para poder brindar alguna ayuda a quien tenga el mismo problema.

Dicho error solo se me presentaba con una consulta que tenía la particularidad de hacer un SELECT con muchos campos solicitados, al final encontré una explicación en una página que listaba los errores de Informix:

528 Maximum output rowsize max-size exceeded.

The total number of bytes that this statement selects exceeds the maximum that can be passed between the database server and the program. Make sure that the columns selected are the ones that you intended. Check that you have not named some very wide character column by mistake, neglected to specify a substring, or specified too long a substring. If the selection is what you require, rewrite this SELECT statement into two or more statements, each of which selects only some of the fields. If it is a join of several tables, you might best select all desired data INTO TEMP; then select individual columns of the temporary table. If this is a fetch via a cursor in a program, you might revise the program as follows. First, change the cursor to select only the ROWID of the desired row. Second, augment the FETCH statement with a series of SELECT statements, each of which selects one or a few columns WHERE ROWID = the saved row ID.

Lo cual explica básicamente que este error aparece debido a que se excede el límite de bytes que pueden ser transferidos desde el servidor de base de datos y el programa o la aplicación que realiza la consulta, la cual está limitada a 32k (esto no lo dice ahí pero se infiere en el error), lo que se recomienda es lo lógico, lo cual es bien quitar campos en el SELECT que no vayamos a utilizar, y de no ser posible esto entonces dividir la consulta en dos o más sentencias, de esta manera cada consulta se ejecutará correctamente y luego en nuestra aplicación tendríamos que hacer una fusión de los datos devueltos en cada una de las consultas. También ofrece una opción un poco más complicada referente a pasar la información a una tabla temporal utilizando el ROWID, pero debido a la complicación que conlleva no se me hace una opción viable.

En resumen el error solo se muestra cuando una fila es demasiado pesada para poder transferirse del servidor a la aplicación, esto también puede pasar debido a que los campos solicitados son demasiado grandes, es decir si tenemos campos de texto con mucha capacidad y llamamos muchos entonces provocaremos que se exceda este límite, por lo que otra solución puede ser en la consulta sacar un substring límitado a la información necesaria de cada uno de los campos de texto que tengan capacidad para más caracteres de los que en realidad utilizamos. O bien cambiar la tabla/tablas modificando los campos con capacidades menores de ser posible.

Espero les sirva la información.

¿Algo que decir? ¡Comentalo!