完全版 ESQL/C资料三


第四节 ORACLE数据库的嵌入SQL语言
4.1 基本的SQL语句
4.1.1宿主变量和指示符
1)、声明方法
同其他数据库管理器一样,ORACLE使用宿主变量传递数据库中的数据和状态信息到应用程序,应用程序也通过宿主变量传递数据到ORACLE数据库 。根据上面两种功能,宿主变量分为输出宿主变量和输入宿主变量 。在SELECT INTO和FETCH语句之后的宿主变量称作“输出宿主变量”,这是因为从数据库传递列数据到应用程序 。除了SELECT INTO和FETCH语句外的其他SQL语句中的宿主变量,称为“输入宿主变量” 。这是因为从应用程序向数据库输入值 。如:INSERT、UPDATE等语句 。请看下面这个例子:
int emp_number;
char temp[20];
VARCHAR emp_name[20];
/* get values for input host variables */
printf("Employee number? ");
gets(temp);
emp_number = atoi(temp);
printf("Employee name? ");
gets(emp_name.arr);
emp_name.len = strlen(emp_name.arr);
EXEC SQL INSERT INTO EMP (EMPNO, ENAME)
VALUES (:emp_number, :emp_name);
在上面这个例子中,其中的emp_number和emp_name就是宿主变量 。值得注意的是,它同其他数据库的区别是,定义宿主变量可以不需要BEGIN DECLARE SECTION和END DECLARE SECTION 。
2)、指示符变量
大多数程序设计语言(如C)都不支持NULL 。所以对NULL的处理,一定要在SQL中完成 。我们可以使用主机指示符变量来解决这个问题 。在嵌入式SQL语句中,主变量和指示符变量共同规定一个单独的SQL类型值 。指示符变量是一个2字节的整数 。
针对输入宿主变量和输出宿主变量,指示变量共有下面几种情况:
同输入宿主变量一起使用时:
-1 Oracle将null赋值给列,即宿主变量应该假设为NULL 。
>=0 Oracle将宿主变量的实际值赋值给列 。
同输出宿主变量一起使用时:
-1 表示该列的输出值为NULL 。
0 Oracle已经将列的值赋给了宿主变量 。列值未做截断 。
>0 Oracle将列的值截断,并赋给了宿主变量 。指示变量中存放了这个列的实际长度 。
-2 Oracle将列的值截断,并赋给了宿主变量 。但是这个列的实际长度不能确定 。
从数据库中查询数据时,可以使用指示符变量来测试NULL:
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE :commission INDICATOR :ind_comm IS NULL ...
注意,不能使用关系操作符来比较NULL,这是因为NULL和任何操作都为false 。如:
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE comm = :commission
如果comm列的某些行存在NULL,则该SELECT语句不能返回正确的结果 。应该使用下面这个语句完成:
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE (comm = :commission) OR ((comm IS NULL) AND
(:commission INDICATOR :ind_comm IS NULL));
4.1.2 查询
如果是单行查询,则应该使用SELECT INTO语句 。如果是多行查询,应该使用游标或宿主变量数组 。如:单行查询的一个例子:
EXEC SQL SELECT ename, job, sal2000
INTO :emp_name, :job_title, :salary
FROM emp
WHERE empno = :emp_number;
在嵌入SQL语句中,也可以使用子查询 。如:
EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno)
SELECT empno, ename, sal, deptno FROM emp
WHERE job = :job_title;
4.1.3 修改数据
1)、插入数据
使用INSERT语句插入数据 。其语法同ANSI SQL语法类似 。如:
EXEC SQL INSERT INTO emp (empno, ename, sal, deptno)
VALUES (:emp_number, :emp_name, :salary, :dept_number);
2)、更新数据
使用UPDATE语句更新数据 。其语法同ANSI SQL语法类似 。如:
EXEC SQL UPDATE emp
SET sal = :salary, comm = :commission
WHERE empno = :emp_number;
3)、删除数据
使用DELETE语句删除数据 。其语法同ANSI SQL语法类似 。如:

推荐阅读