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
WHERERESUME_FORMAT = 'ascii';

return SUCCESS;
}



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


编译上述程序之后返回的错误:

db2 prep test4.sqc

LINE MESSAGES FOR test4.sqc
--------------------------------------------------------------------------
SQL0060WThe "C" precompiler is in progress.
8 SQL0314NThe host variable "ResumeData" is incorrectly
declared.
SQL0092NNo package was created because of previous
errors.
SQL0091WPrecompilation 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
--------------------------------------------------------------------------
SQL0060WThe "C" precompiler is in progress.
SQL0091WPrecompilation or binding was ended with "0"
errors and "0" warnings.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值