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 語句定義的聲明部分