C 和 C++ 应用程序中的嵌入式 SQL 语句
必须先设置应用程序并使其能够支持嵌入式 SQL,然后才能使用 SQL 语句。
嵌入式 SQL C 和 C++ 应用程序由三个用于设置和发出 SQL 语句的主要元素组成。
- 用于声明主变量的声明节。 不必在声明节中包括 SQLCA 结构的声明。
- 应用程序的主体,此主体由 SQL 语句的设置和执行组成。
- 用于落实或回滚 SQL 语句所作的更改的逻辑布置。
- 正确的 C 和 C++ 元素语法
- 语句初始化符
- EXEC SQL
- 语句字符串
- 任何有效的 SQL 语句
- 语句终止符
- 分号(;)
例如,要在 C 应用程序中以静态方式发出 SQL 语句,需要在应用程序代码中包括
EXEC SQL
语句: EXEC SQL SELECT col INTO :hostvar FROM table;
以下示例说明如何使用主变量
stmt1
以动态方式发出 SQL 语句: strcpy(stmt1, "CREATE TABLE table1(col1 INTEGER)");
EXEC SQL EXECUTE IMMEDIATE :stmt1;
在 C 和 C++ 应用程序中执行嵌入式 SQL 语句时,下列准则和规则适用:
- 可以在 EXEC SQL 语句初始化符所在的行开始 SQL 语句字符串。
- 不要将 EXEC SQL 分割为多行。
- 必须使用 SQL 语句终止符。 如果未使用此终止符,那么预编译器将一直处理到应用程序中的下一个终止符。 这可能会导致不确定的错误。
- 可以在语句初始化符之前或者语句终止符之后放置 C 和 C++ 注释。
- 可以将多个 SQL 语句以及 C 或 C++ 语句放在同一行。 例如:
EXEC SQL OPEN c1; if (SQLCODE >= 0) EXEC SQL FETCH c1 INTO :hv;
- 括在引号中的字符串可以包含回车符、换行符和制表符。 SQL 预编译器将保留这些字符不变。
- 不要使用 #include 语句来包括那些包含 SQL 语句的文件。 系统将在编译模块前对 SQL 语句进行预编译。 预编译器将忽略 #include 语句。 而是,请使用 SQL INCLUDE 语句来导入包含文件。
- 允许在嵌入式 SQL 语句(以动态方式发出的语句除外)所包含的任何行中包括 SQL 注释。
- SQL 注释的格式是,以两个短划线(
--
)开头,后跟由零个或零个以上字符组成的字符串,并终止于行尾。 - 不要在 SQL 语句终止符之后放置 SQL 注释。 编译器将把这些 SQL 注释解释为 C 或 C++ 语法,从而导致编译错误。
- 可以在静态语句字符串中任何允许空格的位置使用 SQL 注释。
- 在静态和动态嵌入式 SQL 语句中,允许使用 C 和 C++ 注释定界符
/* */
。 - 在静态 SQL 语句中,不允许使用
//
样式的 C++ 注释。
- SQL 注释的格式是,以两个短划线(
- 在 C 和 C++ 应用程序中,SQL 字符串文字和定界标识可以跨换行符延续。 要实现此目的,请在要中断的行的末尾使用反斜杠(\)。 例如,要从 staff 表中的 NAME 列中选择 NAME 列等于“Sanders”的数据,请执行类似于以下样本代码的操作:
EXEC SQL SELECT "NA\ ME" INTO :n FROM staff WHERE name='Sa\ nders';
在作为 SQL 语句传递到数据库管理器的字符串中,不包括任何新行字符(例如回车符和换行符)。
- 空格字符(例如行尾符和制表符)的替换如下所示:
- 当它们出现在引号外部但在 SQL 语句内部时,行尾符和制表符被替换为单个空格。
- 当它们出现在引号内时,行尾符将消失,条件是字符串对于 C 程序能够正确地延续。 制表符不会被修改。
注意,随平台不同,用作行尾符和制表符的实际字符也将有所变化。 例如,基于 UNIX 和 Linux® 的系统使用换行。