DB2 -314 SQL0314N The host variable XXX is incorrectly 处理

SQC 


SQL长度超过32K,预编译失败,报错信息如下:


LINE    MESSAGES FOR tbl_datamart_trans_log.sqc
------  --------------------------------------------------------------------
        SQL0060W  The "C" precompiler is in progress.
   33   SQL0314N  The host variable "sSql" is incorrectly declared.
        SQL0095N  No bind file was created because of previous 
                  errors.
        SQL0092N  No package was created because of previous 
                  errors.
        SQL0091W  Precompilation or binding was ended with "3" 
                  errors and "0" warnings.


发生错误是因为 DB2 字符串不应该大于 32672 字节。


SQL0314N错误信息说明:


 DB2 V9.5 for Linux, UNIX, and Windows

SQL0314N

不正确地声明了主变量 名称

说明

因为下列其中一种原因,未正确地声明主变量  名称
  • 指定的类型不是受支持的类型。
  • 长度规范是 0、负数或太大。
  • 使用了初始化程序。
  • 指定了不正确的语法。

变量仍未定义。

用户响应

确保仅正确地指定了数据库管理器支持的声明。

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/topic/com.ibm.db2.luw.messages.sql.doc/doc/msql00314n.html



示例代码:



大小超过 32672 的主机变量示例

                
#include  <stdio.h>

EXEC SQL INCLUDE SQLCA;

int test_ArraySize(void)
{
        EXEC SQL BEGIN declare SECTION;
        char ResumeData[65533];
        EXEC SQL END declare SECTION;

        EXEC SQL select RESUME
        INTO    :ResumeData
        FROM EMP_RESUME
         WHERE  RESUME_FORMAT = 'ascii';

        return SUCCESS;
}



如果试图像 这样用 db2 prep 预编译器编译此程序,将会返回一个错误。


编译上述程序之后返回的错误:
                
db2 prep test4.sqc

LINE    MESSAGES FOR test4.sqc
------  --------------------------------------------------------------------
        SQL0060W  The "C" precompiler is in progress.
    8   SQL0314N  The host variable "ResumeData" is incorrectly
                  declared.
        SQL0092N  No package was created because of previous
                  errors.
        SQL0091W  Precompilation or binding was ended with "2"
                  errors and "0" warnings.



发生错误是因为 DB2 字符串不应该大于 32672 字节。任何更长的数据都必须表示为一个 CLOB 数据类型。


处理方法:


要解决这个错误,需要对大于 32672 的主机变量使用以下语法:


用于较大主机变量的语法
                
EXEC SQL BEGIN declare SECTION;
        SQL TYPE IS CLOB (65533) ResumeData;
EXEC SQL END declare SECTION;


然后可以继续操作:

 正确声明主机变量之后程序被成功编译
                
db2 prep test4.sqc

LINE    MESSAGES FOR test4.sqc
------  --------------------------------------------------------------------
        SQL0060W  The "C" precompiler is in progress.
        SQL0091W  Precompilation or binding was ended with "0"
                  errors and "0" warnings.

警告:现在,尽管 DB2 预编译成功了,但是还会碰到编译问题,因为最初的 char *ResumeData 已经被转换为 struct { int length; char *data; } ResumeData;。 必须管理数据和长度属性,这很可能需要更改代码。 

猜你喜欢

转载自blog.csdn.net/xiyuan1999/article/details/8088772