C语言开发过程中,需要对数据库进行操作,使用 Oracle 数据库一般会采用Oracle Pro*C/C++ 预编译器。
本文章参考Oracle官方文档和自我实践,实验环境为 RHEL7 和 Oracle19c,详细介绍 Oracle Pro*C/C++ 预编译器,了解它在开发操作 Oracle 数据的应用程序中的作用,并了解它使您的应用程序能够做什么,具体如使用。
本章介绍嵌入式 SQL 语法、编码约定以及特定于 C 的功能和限制。
声明
一个 DECLARE SELECT 包含宿主变量声明和的形式为:
EXEC SQL SELECT ENAME, SAL
INTO :emp_name, :salary -- 宿主变量
FROM EMP
WHERE DEPTNO = :dept_number;
声明部分以声明开头:
EXEC SQL BEGIN DECLARE SECTION;
并以声明结尾:
EXEC SQL END DECLARE SECTION;
在这两个语句之间只允许以下内容:
- 宿主变量和指标变量声明
- 非宿主 C/C++ 变量
- EXEC SQL DECLARE 语句
- EXEC SQL INCLUDE 语句
- EXEC SQL VAR 语句
- EXEC SQL TYPE 语句
- EXEC ORACLE 语句
- C/C++ 注释
宿主变量名称
宿主变量名称可以由大写或小写字母、数字和下划线组成,但必须以字母开头, 可以是任意长度,但只有前 31 个字符对 Pro*C/C++ 有意义。 C 编译器或链接器可能需要更短的最大长度,因此请查看 C 编译器用户指南。
为了可移植性,英爱将宿主变量名称的长度限制为 18 个或更少的字符(SQL 标准规定的长度)。
常数
一个大号或升后缀指定长整数常数,ü或ü后缀指定的无符号的整数常数,0X或0X前缀指定一个十六进制整数常数,和一个˚F或˚F后缀指定一个浮子浮点常数。这些形式不允许再SQL语句中使用。
跨行延续
您可以从一行到下一行继续 SQL 语句。必须使用反斜杠 () 将字符串文字从一行延续到下一行,如以下示例所示:
EXEC SQL INSERT INTO dept (deptno, dname) VALUES (50, 'PURCHAS\
ING');
在这种情况下,预编译器将反斜杠视为连续字符。
运算符
逻辑运算符和“等于”关系运算符在 C 和 SQL 中是不同的,如下表所示。这些C运算不会允许在SQL语句中使用:
| SQL运算符 | C 运算符 |
|---|---|
| 不是 | ! |
| 和 | && |
| 或者 | || |
| = | == |
下面的C运算符也不允许在SQL语句中使用:
| 类型 | C 运算符 |
|---|---|
| 地址 | & |
| 位运算 | &, |, ^, ~ |
| 复合赋值 | +=、-=、*= |
| 条件赋值 | ?: |
| 递减 | -- |
| 递增 | ++ |
| 间接 | * |
| 模量 | % |
| 转移 | >>,<< |
MAXLITERAL 默认值
预编译器选项 MAXLITERAL 允许您指定预编译器生成的字符串文字的最大长度。
MAXLITERAL 默认值为 1024。如果需要,指定一个较小的值。例如,如果您的 C 编译器无法处理长度超过 512 个字符的字符串文字,则指定 MAXLITERAL=512。检查C 编译器用户指南。