解决实际业务问题只用SQL语言或只用高级语言是远远不够的,必须SQL语言与高级语言一
起使用才能够高效地解决之。
1)高级语言负责提供程序控制流程,即:
顺序、分支和循环,以及对变量的处理
2)SQL语言负责提供从数据库中存取信息功能
select、update、delete、grant,
8.1嵌入式SQL(ESQL)
8.1.1处理过程
定义:就是将SQL嵌入高级语言中,比如C、C++、JAVA、Python等
嵌入式SQL前缀:为了区分SQL语句和主语言语句,必须加前缀
例如:
C语言:EXEC SQL <SQL语句>
例:
include〈stdio.h>
#include〈string.h〉
EXEC SOL BEGIN DECLARE SECTION;
int newage=30;
EXEC sql END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
int main()
{
EXEC SOL CONNECT:"scott"identified by:"welcome"using:"orcl";
EXEC SQL update Student set age=:newage where sno='1234';
EXEC SQL COMMIT RELEASE;
}
8.1.2SQL与主语言的通信
SQL通信区
SQLCA是一个数据结构
它会被传递到需要与数据库服务器进行通信的所有
数据库库函数中。它会在所有嵌入式SQL语句上被隐式传递
用途:
SQL语句执行后,RDBMS反馈给应用程序信息
这些信息将送到SQL通信区SQLCA中
应用程序从SQLCA中取出这些状态信息,据此决定
接下来执行的语句
struct sqlca{
char sqlcaid[8];
long sqlcabc;
long sqlcode;
struct
unsigned short sqlerrml;
char sqlerrmc[70];
sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlext[8];
};
struct sqlca sqlca;
主变量:
主变量(Host variable)SQL语句中使用的主语言程序变量。
主变量必须在
begin declare section与 end declare section
之间进行说明。在SQL语句中使用主变量,须在变量前
加冒号(:)。
例:
begin declare section
char v sn[10];
int v age;
char givensno[6];
end declare section
EXEC SQL select sname,age
into :v sn,:v_age
from student
where sno=:givensno
注:主变量只需要在SQL语句中加冒号,在主程序中不用加
建立和关闭数据库
(1)建立与数据库的连接
其中system是要连接的数据库
exec sql connect to "system"
identified by:"1234"using "mydb";
(2)关闭与数据库连接
exec sql disconnect "mydb";
游标
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。
每个游标区都有一个名字。
游标的作用:可以通过游标逐一获取记录
并赋给主变量,交给主语言进一步处理。
因为每次查询可能查询出很多数据,放到一个变量里不合理,所以会开放一个存这些查询数据的区域,游标也就是指针。
使用游标的步骤:
1.说明游标(declare)
语句格式
EXEC SQL DECLARE<游标名>
CURSOR
FOR<SELECT语句>;功能
是一条说明性语句,这时DBMS并不执行
SELECT指定的查询操作。
2.打开游标(open)
语句格式
EXEC SQL OPEN<游标名>;
功能
执行相应的SELECT语句,把所有满足
查询条件的记录从指定表取到缓冲区中。
这时游标处于活动状态,指针指向查询结
果集中第一条记录。
3.推进游标指针并提取当前记录(fetch)
语句格式
EXEC SQL FETCH FROM<游标名> INTO<主变量表>:
功能
1.指针下移一行。
2.将当前行的记录数据取出,依次给主变
量赋值。
4.关闭游标(close)
语句格式
EXEC SQL CLOSE<游标名>:
功能
1.关闭游标2.释放结果集占用的缓冲区及其他资源。
推进游标指针并取当前记录
使用FETCH语句
语句格式
EXEC SQL FETCH [[NEXTPRIOR
FIRSTLAST]FROM]<游标名>
INTO<主变量>[<指示变量>][,<主变量>
[<指示变量>]…;
功能
指定方向推动游标指针,然后将缓冲区中的当前记
录取出来送至主变量供主语言进一步处理NEXTPRIORFIRST LAST:指定推动游标指
针的方式NEXT:向前推进一条记录
PRIOR:向回退一条记录
FIRST:推向第一条记录
LAST:推向最后一条记录\
缺省值为NEXT
8.2过程化SQL
8.2.1PL/SQL的块结构
基本的SQL是高度非过程化的语言。
嵌入式SQL将SQL语句嵌入到程序设计语言,借助
高级语言的控制功能实现过程化。过程化SQL是对SQL的扩展,使其增加了过程化语
句功能。
过程化SQL是由块组成的,块与块之间可以嵌套,每个块完成一个逻辑操作
存储过程(Stored Procedure)一组完成特定功能的SQL语句集。
匿名块:每次执行时都要进行编译,它不能被存诸
到数据库中,也不能在其他的PL/SQL块中调用。declare V number(4); begin select count(*)into V from SC: dbms_output.put line('元组数为:'‖V); end;
命名块:编译后保存在数据库服务器中,可以被反
复调用,运行速度较快```SQL
create procedure myPro as
V number(4);
begin
select count(*)into V from SC;
dbms_output.put_Iine('元组数为:'‖V);
end;
PL/SQL块组成:定义十执行+异常处理。
8.2.2变量和常量的定义
变量定义:
变量名 数据类型[[NOT NULL] 初值表达式]
常量定义:
常量名 :=表达式
赋值语句:变量名:=表达式
变量类型
普通
属性
元组
8.2.3流程控制
if:
if 条件语句 then
,记着要加thenif else
loop 、while-loop、 for-loop
//普通loop loop ... end loop //while-loop: while condition loop .... END loop for-loop: for i in 1..5 loop ... end loop
exception:意外处理
8.3存储过程
存储过程的用户接口
创建存储过程
```SQL
create procedure myPro as
begin
...
end;执行存储过程
call myPro(); exec myPro;x
删除存储过程
```SQL
drop procedure myPro;