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++ 注释。
  • 在 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® 的系统使用换行。