数据库——存储过程、存储函数与包

前言

一道题目问“存储过程、存储函数与包作用和联系”,发现自己对于这几个概念还不太了解,就此记录一下

正文

过程化SQL块主要有两种类型,即命名块匿名块匿名块每次执行都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调用。过程函数是命名块,它们被编译后保存在数据库中,称为持久性存储模块,可以被反复调用,运行速度较快

存储过程

存储过程是由过程化SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。

  • 不带参数
create procedure 存储过程名
as
begin
	SQL语句1
    SQL语句2
...
end

例子:创建一个存储过程procOther,在studentcourse表中,如果学号为“8001”的平均成绩大于等于80分则输出信息“成绩优秀”,否则输出信息“成绩一般”

create procedure proOther2
as avg_grade float
begin
	select avg_grade = avg(grade)
	from studentcourse
	where sno='8001'
	if avg_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
)

包是一组相关的过程、函数及其使用的游标,变量等构成的程序单元,存储于数据库中供用户使用,由此可见包可以方便地将存储过程和函数组织到一起简化应用设计、提高性能、实现信息隐藏、子程序重载
关于一篇

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储函数和自定义函数是两种不同的概念。引用\[1\]中提到,存储函数是在数据库中创建的一种函数,它必须有一个return子句用于返回函数值,并且可以通过CREATE FUNCTION语句来创建。而自定义函数是指用户自己定义的函数,可以在程序中使用,但不是在数据库中创建的。引用\[2\]中提到,在MySQL中,存储过程函数可以使用CREATE PROCEDURE和CREATE FUNCTION语句来创建,而自定义函数则可以直接在程序中定义。存储过程函数可以通过CALL语句来调用,而自定义函数可以通过函数名来引用。此外,存储过程函数可以有输出参数,可以返回多个值,而自定义函数通常只能返回一个标量值。根据引用\[3\]中的原则,如果只有一个返回值,通常使用存储函数;如果有多个返回值,通常使用存储过程。 #### 引用[.reference_title] - *1* *3* [Oracle数据库——存储过程和自定义函数](https://blog.csdn.net/hyh17808770899/article/details/106867758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [八、存储过程与自定义函数](https://blog.csdn.net/qq_52059326/article/details/124399461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值