数据库系统—高级SQL

本文详细介绍了SQL中的游标使用,包括声明、打开、读取和关闭游标的过程,以及如何通过游标进行数据的修改。此外,还讨论了动态SQL的prepare和execute步骤,以及如何在需要重复执行的场景下使用。最后提到了持久存储模块中的函数和过程创建,以及触发器的使用,如timeslot_check1和timeslot_check2,强调了数据一致性的重要性。
摘要由CSDN通过智能技术生成

在应用中使用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 <已经prepareSQL语句> [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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值