From《数据库系统概念》
import java.sql.*; public class DataBase { public static void main() { } } /* 5.2 函数与过程 ——我这儿简简单单的过一下,之后在复习下MySQL这块的内容~~~ 5.2.1 声明和调用SQL函数和过程 案例一: create function dept_count(dept_name varchar(20) returns integer begin declare d_count integer select count(*) into d_count from instructor where instructor.dept_name = dept_name return d_count end select dept_name,budget from department where dept_count(dept_name)>12; 案例二: create function instructor_of(dept_name varchar(20)) returns table( ID varchar(5) name varchar(20), dept_name varchar(20), salary numeric(8,2) return table (select ID,name,dept_name,salary from instructor where instructor.dept_name = instructor.dept_name); select * from table(instruction_of('Finance')); 案例三: create procedure dept_count_proc(in dept_name varchar(20), out d_count integer) begin select count(*) into d_count from instructor where instructor.dept_name = dept_count_proc.dept_name; end declare d_count integer; call dept_count_proc('Physics',d_count); 知识点: 关系作为返回结果的函数,被称为表函数。通常,以表为值的函数又可以被看做带参数 的视图,它通过允许参数将视图的概念更加一般化。 */ /* 5.2.2 支持过程和函数语言构造 知识点: 1.变量通过declare进行声明,通过set语句进行赋值。 2复合语句,有begin。。。end和begin atomic。。。end版本 3.支持while语句、repeat语句 while 布尔表达式 do 语句序列 end while repeat 语句序列 util 布尔表达式 end repeat 4.支持for语句 declare n integer default 0; for r as select budget from department where dept_name='Music' do set n=n-r。budget end for 解析: 程序每次获取查询结果的一行,并存入for循环变量中。语句leave可用来退出循环 而iterate表示跳过剩余语句从循环的开始进入下一个元组。 5.支持if-then-else语句 if 布尔表达式 then 语句或复合语句 elseif 布尔表达式 then 语句或复合语句 else 语句或复合语句 end if 6.支持case语句 7.支持发信号通知异常时间,以及声明句柄来处理异常 //在确保教师能容纳下的前提下注册一个学生 //如果成功注册,返回0,如果超过教师容量则返回-1 create function registerStudent( in s_id varchar(5), in s_courseid varchar(8), in s_secid varchar(8), in s_semester varchar(6), in s_year numeric(4,0), out errorMsg varchar(100)) return integer begin declare curEnrol int; select count(*) into curEnrol from takes where course_id=s_courseid and sec_id=s_secid and semester=s.semester and year = s_year; declare limit int; select capacity into limit from calssroom natural join section where course_id = s_sourseid and sec_id = s_secid and semester=s.semester and year = s_year; if(curEnrol < limit) begin insert into takes values (s_id,s_courseid,s_secid,s_semeter,s_year,null) return(0) end //否则,已经到达了课程容量上线 set errorMsg = 'Enrollnumljljljljlj' return(-1) end declare out_of_classroom_seats condition declare exit handler for out_of_classroom_seats begin sequence of statements end */ /* 5.2.3 外部语言过程 知识点: 通常来说,外部语言过程需要处理参数(包括in和out参数)和返回值中的空值。还需要传递操作失败/成功 的状态,以方便对异常进行处理。这些信息可以通过几个额外的参数来表示:一个指明失败/成功状态的 sqlstate值,一个存储函数返回值的参数、以及一些指明每个参数/函数结果的值是否为空的指示器变量 还可以通过其他机制来解决空值问题,例如,可以传递指针而不是值~~~~如果一个函数不关心这些情况, 可以在声明语句的上方额外添加一行parameter style general指明外部过程/函数只使用说明的变量 并且不处理空值和异常。 */