Pro*C入门手册+语法详解
概述
嵌入式 SQL 是一种结合 C/C++ 等高级语言的计算能力和 SQL 的数据库操作能力的方法。它允许您从应用程序执行任何 SQL 语句。Oracle 的嵌入式 SQL 环境称为 ProC。
ProC 程序分两步编译。首先,Pro*C预编译器 识别程序中嵌入的 SQL 语句,并将它们替换为对 SQL 运行时库中函数的适当调用。输出是纯 C/C++ 代码,所有纯 C/C++ 部分都完好无损。然后,使用常规 C/C++ 编译器编译代码并生成可执行文件。有关详细信息,请参阅演示程序部分。
Pro*C 语法
SQL
所有 SQL 语句都需要以EXEC SQL开头并以分号“ ; ”结尾。您可以将 SQL 语句放置在 C/C++ 块中的任何位置,但限制是声明性语句不在可执行语句之后。举个例子:
{
int a;
/* ... */
EXEC SQL SELECT salary INTO :a
FROM Employee
WHERE SSN=876543210;
/* ... */
printf("The salary is %d\n", a);
/* ... */
}
预处理器指令
与 ProC 一起使用的 C/C++ 预处理器指令是#include 和#if。ProC 无法识别#define。例如,以下代码无效:
应该仅仅是#define 定义的宏不能用于SQL语句。
#define THE_SSN 876543210
/* ... */
EXEC SQL SELECT salary INTO :a
FROM Employee
WHERE SSN = THE_SSN; /* 无效的*/
声明标签
您可以将 C/C++ 标签与 SQL 连接起来,如下所示:
EXEC SQL WHENEVER SQLERROR GOTO error_in_SQL;
/* ... */
error_in_SQL:
/* 进行错误处理 */
我们将在稍后的错误处理部分讨论WHENEVER的含义。
宿主变量
基本
宿主变量是宿主程序与数据库之间通信的关键。宿主变量表达式必须解析为左值 (即,它可以被赋值)。您可以根据 C 语法声明宿主变量,就像声明常规 C 变量一样。宿主变量声明可以放置在可以放置 C 变量声明的任何位置。(C++ 用户需要使用声明部分;请参阅C++ 用户部分。)可用于 Oracle 的 C 数据类型包括:
char
char[n]
int
short
long
float
double
VARCHAR[n] - 这是 Pro*C 预编译器识别的伪类型。它用于表示空白填充的可变长度字符串。Pro*C 预编译器会将其转换为具有 2 字节长度字段和n字节字符数组的结构。
您不能对宿主变量使用寄存器 存储类说明符。
宿主变量引用在 SQL 语句中必须以冒号“ : ”为前缀,但在 C 语句中不应以冒号为前缀。通过宿主变量指定字符串文字时,必须省略单引号;Pro*C 理解您正在根据宿主变量的声明类型指定字符串。C 函数调用和大多数指针算术表达式不能用作宿主变量引用,即使它们确实可以解析为左值。以下代码说明了合法和非法的宿主变量引用:
int deptnos[3] = {
000, 111, 222 };
int get_deptno() {
return deptnos[2]; }
int *get_deptnoptr() {
return &(deptnos[2]); }
int main() {
int x; char *y; int z;
/* ... */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x, :y, :z); /* 合法的 */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x + 1, /* 合法的: 引用 x */
'Big Shot', /* 合法的: 但不是真正的宿主变量 */
:deptnos[2]); /* 合法:数组元素很好 */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x, :y,
:(*(deptnos+2))); /* 非法:尽管它有一个左值