2019独角兽企业重金招聘Python工程师标准>>>

一、函数和存储过程
a)通过函数和存储过程可以将业务逻辑保存在数据库,在需要的时候调用。比如学生在一个学期可以修的最大课程数、导师的最小授课数等,这些判断具有比较复杂的逻辑,虽然在数据库外也可以实现这样的控制,但用函数或存储过程在数据库的入口来把关,可以与应用程序独立开来,便于维护。但感觉将业务逻辑独立写在存储过程也不一定就能便于维护。
b)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 instructor
where dept count(dept name) > 12;
c)函数还可以返回表,称为表函数(table functions),这相当于带参数的视图
create function instructors 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 of.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.dept_name= dept_count proc.dept_name
end
in和out表示数据的输入输出。存储过程还可以重载。
d)存储过程和函数的区别:
函数只能通过return语句返回单个值或者表对象。而存储过程不允许执行return,但是通过out参数返回多个值;
函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行;
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少;
一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。

二、SQL的语法结构
a)SQL也像Java、C等语言一样支持if、for等语法结构,用declare声明变量、用set赋值,但一段SQL要写在begin…end之间,使用begin atomic…end的话,内部的语句构成一个事务。
b)while和repeat
while boolean expression do
sequence of statements;
end while

repeat
sequence of statements;
until boolean expression
end repeat

c)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

d)if
if boolean expression
then statement or compound statement
elseif boolean expression
then statement or compound statement else statement or compound statement
end if

三、触发器Trigger
a)触发器包含两个要素:被触发的时机、被触发后执行的动作。
在数据库自带的一致性约束机制无法满足业务需求时,可以用触发器来限制;也可以实现监控、报警、自动化等需求。
b)触发器的创建
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;
为在section表insert时创建的触发器,referencing new row as nrow会将被插入的行保存到nrow临时变量,然后使用for each row来遍历。
除了插入操作,删除的触发器写法为:
create trigger timeslot_check2 after delete on timeslot
referencing old row as orow
for each row
when (orow.time slot_id not in (
select time slot_id
from time_slot)
and orow.time slot_id in (
select time slot_id from section)) begin
rollback
end;
临时保存的是删除前的旧行,那么update时新行、旧行都需要:
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;
只有takes.grade被更新时才会被触发
c)除了用after定义动作发生后的触发器,还可以使用before在动作发生前触发;除了针对行的触发器(for each row),还有针对表的触发器,对应的语法有;refenencing old/new table as、for each statement
d)触发器虽然可以用来解决很多问题,但如果有替代方法,便不推荐使用触发器,因为触发器的错误只能在运行时发现,而且多个触发器的关联会造成维护的困难。

学习资料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan​

转载于:https://my.oschina.net/u/2327858/blog/1579592

《数据库系统概念》7-函数、存储过程、触发器相关推荐

  1. mysql 触发器定义变量_MySQL 函数存储过程触发器定义简单示例

    1.变量提示 NEW 是新值-- OLD 是旧值 INSERT 只有NEW ----UPDATE有NEW和OLD ---DELETE只有OLD 2.准备测试表(userinfo.userinfolog ...

  2. 【MySQL数据库设计与应用(六)】存储程序(存储过程,存储函数,触发器,事件)

    文章目录 1 存储程序介绍 1.1 什么是存储程序 1.2 存储例程 1.3 触发器 1.4 事件 2 创建和调用存储过程 2.1 创建和调用存储过程 2.2 存储过程的参数模式 2.3 存储过程返回 ...

  3. mysql存储过程与函数、触发器、游标、变量等知识点详解

    引言:该文章仅供自己学习整理 mysql执行顺序 语法顺序 写sql的关键字顺序 select [distinct] from join(如left join) on where group by h ...

  4. oracle 查看函数被哪些触发器引用_oracle如何查看存储过程,存储函数,触发器的具体内容...

    (1)set serveroutput on 实现plsql developer 打印输出 (2)如何查看存储过程,存储函数,触发器的内容 查 user_sources表 eg:查询GET_DEPT_ ...

  5. oracle触发器函数,oracle 存储过程、函数和触发器用法实例详解

    本文实例讲述了oracle 存储过程.函数和触发器用法.分享给大家供大家参考,具体如下: 一.存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 创建存储过程 用CR ...

  6. Oracle-存储过程、存储函数、触发器

    Oracle-存储过程.存储函数.触发器 目录 文章目录 1.存储过程 1.1.概念 1.2.创建语法 1.3.实例 2.存储函数 3.out类型参数 4.存储过程与存储函数直接的区别 3.触发器 * ...

  7. Oracle 11g_过程、函数、触发器和包(6)

    1.存储过程 存储过程是一种命名的PL/SQL块,它既可以没有参数,也可以有若干参数输入,输出参数,甚至可以有多个既作为输入又作为输出的参数,但它通常没有返回值. 存储过程被保存在数据库中,它不可以被 ...

  8. 常用MySQL函数存储过程_解析MySQL存储过程、常用函数代码

    mysql存储过程的概念: 存储在数据库当中可以执行特定工作(查询和更新)的一组SQL代码的程序段. mysql函数的概念: 函数是完成特定功能的SQL语句,函数分为内置函数和自定义函数(user-d ...

  9. 数据库系统概念第六版 第五章练习题 2 4

    数据库系统概念第六版 第五章练习题 2 4 5.2 写一个使用JDBC元数据特性的JAVA函数,该函数用ResultSet作为输入参数,并把结果输出为用合适的名字作为列名的表格形式. (对JAVA不太 ...

  10. mysql视图存储过程触发器

    以下笔记借鉴于黑马MYSQL视频,记录为个人学习笔记参考. 包含视图/存储过程/触发器等概念 目录 视图 view 语法 视图的检查选项 视图更新 作用 存储过程 procedure 语法 变量 系统 ...

最新文章

  1. 阿里大佬告诉你,支付宝的架构到底有多牛逼!还没看完我就跪了!
  2. 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
  3. 金融实战篇:最佳数据驱动之城商行
  4. jeecg-boot自动生成代码_无代码实现销售系统自动判定并生成订单功能
  5. P1407-[国家集训队]稳定婚姻【tarjan,强连通分量】
  6. Perl常用语法记录
  7. WARNING: You are using pip version 19.2.3, however version 20.1.1 is available. You should consi解决办法
  8. Cannot modify the value of a static config: spark.sql.queryExecutionListeners
  9. Paper and Codes Leaderboard
  10. XMLHTTP使用详解
  11. 将excel数据导入到SQL server数据库
  12. 拼音获取啊啊的的js
  13. allennlp.modules.span_extractors
  14. Selenium批量下载抖音无水印高清视频
  15. [复变函数]第20堂课 5.4 整函数与亚纯函数的概念
  16. python计算圆的周长_Python计算圆周长和面积
  17. dell初始linux密码,常用设备管理口默认用户名密码汇总
  18. 行业报告归档 2017.3.21
  19. php cache_expire,PHP session_cache_expire 会话函数
  20. Java企业级常见的设计模式

热门文章

  1. 由内而外:大脑是如何形成感官记忆的
  2. Quanta杂志长文翻译:通过信息论判定个体的边界
  3. AIoT的生死局:未来的AIoT很赚钱,但目前的AI+IoT很花钱
  4. 美国重夺超算“头把交椅”,专家建议中国加快E级超算研制
  5. 华为式创新与海尔式创新——两条道路考验中国制造
  6. CES现场低调的主线,近在咫尺的5G商业化 | CES2018技术趋势
  7. 代数拓扑的数学方法正在变革脑科学
  8. 不愧是你!Python 之父退休太无聊,进微软搞开源!
  9. MOSS2007最终用户培训资料
  10. re模块与正则表达式