DB2 预编译器不能识别声明部分中用户定义的数据类型(typefef,#define macros),位于
EXEC SQL BEGIN DECLARE SECTION 和
EXEC SQL END DECLARE SECTION 语句之间。
由于参数类型不同,使用用户定义函数(UDF)(比如 ||、rawtohex、hextoraw,等等)开发的应用程序不能在 DB2 上编译。
问题 1
如果在
EXEC SQL BEGIN DECLARE SECTION 和
EXEC SQL END DECLARE SECTION 语句之间使用了用户定义的数据类型(例如 C/C++ 中的 “typedef”)和宏(#define),那么 DB2 预编译器在编译这些程序时会遇到一些问题。
因此,如果将一个包含嵌入式 SQL 语句的文件(.sqC)传递到 db2 precompile 命令,则编译时会提示出错。如清单 1 所示。
注:
此示例只是为了描述问题并在编译之后生成相应的错误,所以其形式非常简单。要重现此场景,可以执行 db2 "create table test_table (dept int)" 命令创建一个 “TEST_TABLE” 表。
考虑如下的 test1.sqC 文件:
清单 1. test1.sqC
#include <stdio.h>
#define LONGBIG long
/*
Or we can have
a definition like:
typedef long LONGBIG
*/
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
LONGBIG col1_val;
EXEC SQL END DECLARE SECTION;
int main()
{
EXEC SQL SELECT DEPT
INTO :col1_val
FROM TEST_TABLE;
return 0;
}
当试图使用 db2 prep 编译 test1.sqC 文件时,会得到以下错误:
清单 2. 预编译 test1.sqC 的结果
db2 prep test1.sqC bindfile
LINE MESSAGES FOR test1.sqC
------ --------------------------------------------------------------------
SQL0060W
The "C++" precompiler is
in progress.
11 SQL0008N
The token "LONGBIG"
found in a host variable declaration is not valid.
18 SQL4942N
The statement selects an incompatible data type
into
host variable ":col1_val". SQLSTATE=42806
SQL0095N No bind file was created because of previous
errors.
SQL0091W Precompilation or binding was ended with "3"
errors and "0" warnings.
[db2inst1]/users/ganesh_gosavi/mig1/issues/NULL_issue>
出现这些错误是因为 DB2 预编译器不能解析一些 typedef 和宏,这些 typedef 和宏用于通过
EXEC SQL BEGIN DECLARE SECTION 和
EXEC SQL END DECLARE SECTION 语句定义的声明部分