在应用中使用SQL
嵌入式SQL
前缀EXEC SQL
声明宿主变量 DECLARE SECTION(BEGIN - END)
将单条记录的查询结果传递给宿主变量 INTO
游标(Cursor)
游标是系统开设的一个数据缓冲区,存放SQL语句的执行结果。游标有一个名字,可以通过游标逐一获取记录,并赋予宿主语言的宿主变量
游标由以下两部分组成:
- cursor result set(游标结果集):由定义游标的SELECT语句返回的行的集合
- cursor position(游标的位置):指向这个集合中的某一行的指针
使用Cursor读取数据
-
声明游标
EXEC SQL DECLARE <游标> [INSENSITIVE][SCROLL] CURSOR FOR <SELECT语句> [FOR READ ONLY]
INSENSITIVE:不允许其他的事务修改游标中的数据
SCROLL:定义为滚动游标
-
打开游标
EXEC SQL OPEN <游标名>
-
存取游标
EXEC SQL FETCH [FROM] <游标名> INTO <宿主变量>
EXEC SQL FETCH {NECT | PRIOR|FIRST|LAST|ABSOLUTE n|RELATIVE n} FROM <游标名> INTO <宿主变量>
-
关闭游标
EXEC SQL CLOSE <游标名>
使用cursor修改数据
声明游标时没有添加FOR READ ONLY关键字
一般不要修改机遇多表的索引
EXEC SQL UPDATE <表名> SET <属性名>=<value>
WHERE CURSOR OF <游标名>
EXEC SQL DELETE <表名>
WHERE CURSOR OF <游标名>
动态SQL
prepare
EXEC SQL PREPARE <SQL语句名> FROM:<字符串>
execute
EXEC SQL EXECUTE <已经prepare的SQL语句> [USING : <宿主变量名>,<宿主变量名>,...]
execute IMMEDIATE
EXEC SQL EXECUTE:<字符串>
需要重复执行多次时使用
持久储存模块
调用级接口
函数
create function function_name(dept_name varchar(20))
returns table(
ID varchar(5),
name varchar(5),
dept_name varchar(20)
)
return table
(
select ID,name,dept_name
from instructor
where instructor.dept_name = function_name.dept_name
)
过程
create procedure dept_count_proc(in dept_name varchar(20),out d_count integer)
begin
select count(*) into d_count
from instructor
where instructor.name = dept_count_proc.dept_name
end
持久存储模块
触发器
create trigger timeslot_check1 after insert on section
referencing new row as nrow
for each row
when(
nrow.time_slot_id not in(
select time_slot_id
from time_slot
)
)
begin
rollback
end;
create trigger timeslot_check2 after delete on time_slot
referencing old row as orow
for each row
when(
orow.time_slot_id not in(
select time_slot_id from time_slot
)
)
begin
rollback
end;
create trigger credits_earned after update of takes on (grade)
referencing new row as nrow
referencing old row as orow
for each row
when(
)
begin atomic
<>
end;