程序环境中的S咀语句
程序环境中的SQL语句
在程序中使用SL SQL语言的程序使用方式就是嵌入 某种高级语言程序中(例如C), 该语言称为宿主语言。在这样的程 序中,由SQL语句实现对数据库的 访问,而宿主语言的语句则完成对 数据的各种处理功能,还可担当与 用户的交互。很多数据库应用程序 就是采用此种编程方式实现的
在程序中使用SQL SQL语言的程序使用方式就是嵌入 某种高级语言程序中(例如C), 该语言称为宿主语言。在这样的程 序中,由SQL语句实现对数据库的 访问,而宿主语言的语句则完成对 数据的各种处理功能,还可担当与 用户的交互。很多数据库应用程序 就是采用此种编程方式实现的
包含S叫的宿主语言程序 主语言+嵌入的SQL语句 预处理程序 主语言+函数调用 主语言编译程序4SQL库 主语言程序
包含SQL的宿主语言程序 主语言+嵌入的 SQL 语句 SQL 库 预处理程序 主语言+函数调用 主语言编译程序 主语言程序
SL与宿主语言 信息沟通一用能被SQL语句使用的主 语言变量来传递信息。这些共享的变 量在主语言中使用时同其他变量一样 但在SQL语句中引用时,要在变量名 前加上冒号 语法形式一当在主语言中书写SQL代 码时,为了便于预处理程序识别它 我们要在SQL语句前加上 EXEC SQL 关键字
SQL与宿主语言 信息沟通-用能被SQL语句使用的主 语言变量来传递信息。这些共享的变 量在主语言中使用时同其他变量一样, 但在SQL语句中引用时,要在变量名 前加上冒号。 语法形式-当在主语言中书写SQL代 码时,为了便于预处理程序识别它, 我们要在SQL语句前加上EXEC SQL 关键字
使用无返回值的SL语句 void getdep( f EXEC SQL BEGIN DECLARE SECTION char depno3, depname[101 char deptel 4 EXEC SQL END DECLARE SECTION /*程序读入 depo系号)、 depname(系名 和 deptel(电话)的值* EXEC SQL INSERT INTO dep VALUES( depno ,: depname,: deptel)
使用无返回值的SQL语句 void getdep() { EXEC SQL BEGIN DECLARE SECTION ; char depno[3] , depname[10] ; char deptel[4] ; EXEC SQL END DECLARE SECTION ; /* 程序读入depno(系号)、depname(系名) 和deptel(电话)的值*/ EXEC SQL INSERT INTO dep VALUES(:depno , :depname , :deptel) ; }
返回单行的Se语句 void printageo f EXEC SQL BEGIN DECLARE SECTION int eage, float esal: char empname 6 char SQlstate[6; EXEC SQL END DECLARE SECTION /程序读入要查询的职工姓名读入值 放到变量 empname 中) EXEC SQL SELECT age, sal INTO eage, esal FROM emp Where ename=:empname i IF SQLSTATE ==00000
返回单行的select语句 void printage() { EXEC SQL BEGIN DECLARE SECTION ; int eage; float esal; char empname[6] ; char SQLSTATE[6] ; EXEC SQL END DECLARE SECTION ; /* 程序读入要查询的职工姓名(读入值 放到变量empname中)*/ EXEC SQL SELECT age,sal INTO :eage , :esal FROM emp WHERE ename=:empname ; IF SQLSTATE == '00000' …
使用Se返回结果的更一般方法一光标 ①定义光标 EXEC SQL DECLARE CURSOR FOR 查询语句 该语句属说明语句,其核心是定义了一个光标标识 名和一个查询语句。 ②打开光 EXEC SQL OPEN<光标名 该语句实际上是执行了光标定义中的查询语句,查 询结果(结果关系)存放在光标区中。该语句为 访问光标区中的第一个元组做好了准备
使用select返回结果的更一般方法-光标 ① 定义光标 EXEC SQL DECLARE CURSOR FOR 该语句属说明语句,其核心是定义了一个光标标识 名和一个查询语句。 ② 打开光标 EXEC SQL OPEN 该语句实际上是执行了光标定义中的查询语句,查 询结果(结果关系)存放在光标区中。该语句为 访问光标区中的第一个元组做好了准备
使用Se返回结果的更一般方法一光标 ③读光标区中的当前元组 EXEC SQL FETCH FROMINTO<变量 列表 该语句读取光标区中下一个元组的值,并将它的 各分量依次赋值给指定的共享变量。 如果光标区的元组已经读完,那么系统变量 SQLSTATE的值被设为‘02000,意为“ no tuple found。 ④关闭光杉 EXEC SQL CLOSE<光标名
使用select返回结果的更一般方法-光标 ③ 读光标区中的当前元组 EXEC SQL FETCH FROM INTO 该语句读取光标区中下一个元组的值,并将它的 各分量依次赋值给指定的共享变量。 如果光标区的元组已经读完,那么系统变量 SQLSTATE的值被设为‘02000’,意为“no tuple found”。 ④ 关闭光标 EXEC SQL CLOSE
光标应用例一返回多行的S|et 例:上级部门为职工普调工资,调资的办法是:从 最低工资调起,每人长10%,但工资总额不能超 过50万元。程序代码如下: void addsalaryo LEXEC SQL BEGIN DECLARE SECTION char empnob3], sqlstate[6 float s sal. e sal EXEC SQL END DECLARE SECTION EXEC SQL DECLARE CI CURSOR FOR SELECT eno, sal FROM emp OrDER BY sal ASC
光标应用例-返回多行的select 例:上级部门为职工普调工资,调资的办法是:从 最低工资调起,每人长10%,但工资总额不能超 过50万元。程序代码如下: void addsalary() { EXEC SQL BEGIN DECLARE SECTION; char empno[3] , SQLSTATE[6]; float s_sal, e_sal ; EXEC SQL END DECLARE SECTION ; EXEC SQL DECLARE c1 CURSOR FOR SELECT eno,sal FROM emp ORDER BY sal ASC ;
光标应用例一返回多行的Sect EXEC SQL OPEN cl EXEC SQL SELECT SUM(Sal) into s sal from emp while(s sal < 500000.00) EXEC SQL FETCH FROM CI INTO: e sno, e sal f( SQLSTATE=02000) BREAK;/读完职工记录, 退出循环* EXEC SQL UPDATE emp SET sal=sal* 1.1 WHERE eno= e eno s sa s sal +e sal i 0.1 EXEC SQL CLOSE CI
光标应用例-返回多行的select EXEC SQL OPEN c1 ; EXEC SQL SELECT SUM(sal) into :s_sal from emp ; while (s_sal < 500000.00) { EXEC SQL FETCH FROM c1 INTO :e_sno , :e_sal ; if(SQLSTATE=='02000') BREAK ; /*读完职工记录, 退出循环*/ EXEC SQL UPDATE emp SET sal=sal*1.1 WHERE eno=:e_eno; s_sal = s_sal + e_sal * 0.1 ; }; EXEC SQL CLOSE c1 ; }