The token "EXEC" found in a host variable declaration is not valid
Posted on 2008-12-18 10:08 Prayer 閱讀(1431) 評(píng)論(0) 編輯 收藏 引用 所屬分類: DB2DB2 預(yù)編譯器不能識(shí)別聲明部分中用戶定義的數(shù)據(jù)類型(typefef,#define macros),位于 EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 語(yǔ)句之間。
由于參數(shù)類型不同,使用用戶定義函數(shù)(UDF)(比如 ||、rawtohex、hextoraw,等等)開(kāi)發(fā)的應(yīng)用程序不能在 DB2 上編譯。
問(wèn)題 1
如果在 EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 語(yǔ)句之間使用了用戶定義的數(shù)據(jù)類型(例如 C/C++ 中的 “typedef”)和宏(#define),那么 DB2 預(yù)編譯器在編譯這些程序時(shí)會(huì)遇到一些問(wèn)題。
因此,如果將一個(gè)包含嵌入式 SQL 語(yǔ)句的文件(.sqC)傳遞到 db2 precompile 命令,則編譯時(shí)會(huì)提示出錯(cuò)。如清單 1 所示。
注:
此示例只是為了描述問(wèn)題并在編譯之后生成相應(yīng)的錯(cuò)誤,所以其形式非常簡(jiǎn)單。要重現(xiàn)此場(chǎng)景,可以執(zhí)行 db2 "create table test_table (dept int)" 命令創(chuàng)建一個(gè) “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;
}
當(dāng)試圖使用 db2 prep 編譯 test1.sqC 文件時(shí),會(huì)得到以下錯(cuò)誤:
清單 2. 預(yù)編譯 test1.sqC 的結(jié)果
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>
出現(xiàn)這些錯(cuò)誤是因?yàn)?DB2 預(yù)編譯器不能解析一些 typedef 和宏,這些 typedef 和宏用于通過(guò) EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 語(yǔ)句定義的聲明部分
由于參數(shù)類型不同,使用用戶定義函數(shù)(UDF)(比如 ||、rawtohex、hextoraw,等等)開(kāi)發(fā)的應(yīng)用程序不能在 DB2 上編譯。
問(wèn)題 1
如果在 EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 語(yǔ)句之間使用了用戶定義的數(shù)據(jù)類型(例如 C/C++ 中的 “typedef”)和宏(#define),那么 DB2 預(yù)編譯器在編譯這些程序時(shí)會(huì)遇到一些問(wèn)題。
因此,如果將一個(gè)包含嵌入式 SQL 語(yǔ)句的文件(.sqC)傳遞到 db2 precompile 命令,則編譯時(shí)會(huì)提示出錯(cuò)。如清單 1 所示。
注:
此示例只是為了描述問(wèn)題并在編譯之后生成相應(yīng)的錯(cuò)誤,所以其形式非常簡(jiǎn)單。要重現(xiàn)此場(chǎng)景,可以執(zhí)行 db2 "create table test_table (dept int)" 命令創(chuàng)建一個(gè) “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;
}
當(dāng)試圖使用 db2 prep 編譯 test1.sqC 文件時(shí),會(huì)得到以下錯(cuò)誤:
清單 2. 預(yù)編譯 test1.sqC 的結(jié)果
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>
出現(xiàn)這些錯(cuò)誤是因?yàn)?DB2 預(yù)編譯器不能解析一些 typedef 和宏,這些 typedef 和宏用于通過(guò) EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 語(yǔ)句定義的聲明部分