一道题目问“存储过程、存储函数与包作用和联系”,发现自己对于这几个概念还不太了解,就此记录一下
正文过程化SQL块主要有两种类型,即命名块和匿名块。匿名块每次执行都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调用。过程,包和函数是命名块,它们被编译后保存在数据库中,称为持久性存储模块,可以被反复调用,运行速度较快
存储过程存储过程是由过程化SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。
不带参数 create procedure 存储过程名 as begin SQL语句1 SQL语句2 ... end例子:创建一个存储过程procOther,在studentcourse表中,如果学号为“8001”的平均成绩大于等于80分则输出信息“成绩优秀”,否则输出信息“成绩一般”
create procedure proOther2 as g_grade float begin select g_grade = g(grade) from studentcourse where sno='8001' if g_grade >=80 then dbms_output.put_line('成绩优秀') else dbms_output.put_line('成绩一般') end if end 带参数 带输入参数 例:创建一个带输入参数的存储过程ProcGetStuInfo,功能:根据输入的院系名称,获取属于该院系的所有学生信息 create procedure ProcGetStuInfo(intput_DepartmentName nvarchar(20)) as begin select sno,sname,sex,sage from Department d,Student s where d.DepartmentID=s.DepartmentID and DepartmentName=intput_DepartmentName end 带输出参数 例:创建一个存储过程procGetMyScore,带有1个输出参数v_grade,功能:查找学号为“8001”这个学生所选修的课程号为“001”的这门课程的成绩 create procedure procGetMyScore(v_grade out float) as begin select v_grade = grade from StudentCourse where sno='8001'and cno='001' end 存储函数用户自定义函数和存储过程一样,包含一系列SQL语句,不同之处在于函数必须指定返回类型。
标量函数 返回单个标量值的函数,标量值是指一行一列的结果集 create function 函数名(参数名 数据类型) return 返回数据类型 as begin 函数体 return 标量表达式 end例:创建一个标量函数fnGetYearSalary,它带有一个输入参数v_Rate,返回一个标量值:年薪,数据类型money
create function fnGetYearSalary(v_Rate money) return money as begin set YearSalary=v_Rate *365 return YearSalary end 表值函数 表值函数以表的形式返回一个值,即它返回的是一个表 例:创建一个表值函数fnGetStudent1,它返回一个表,功能:根据输入的院系名称,查找所有属于该院系的学生信息 create function 函数名(参数名 数据类型) return table as return( select 语句 ) create function fnGetStudent1(v_DepartmentName nvarchar(20)) return table as return ( select sno,sname,sex,sage from Student s,Department d where s.DepartmentID=d.DepartmentID and d.DepartmentName=v_DepartmentName ) 包包是一组相关的过程、函数及其使用的游标,变量等构成的程序单元,存储于数据库中供用户使用,由此可见包可以方便地将存储过程和函数组织到一起简化应用设计、提高性能、实现信息隐藏、子程序重载 关于一篇