【SQL】持久性存储模块PSM
1. 创建PSM函数和过程
创建过程:
CREATE PROCEDURE 名字 (参数)
局部声明;
过程体;
创建函数:
CREATE FUNCTION 名字 (参数) RETURNS 类型
局部声明;
过程体;
过程的参数:模式-名字-类型的三元组。模式有 IN, OUT, INOUT,默认为IN
函数的参数:只能是IN。
CREATE PROCEDURE Move(
IN oldAddr VARCHAR(255),
IN newAddr VARCHAR(255)
)
UPDATE MovieStar
SET address = newAddress
WHERE address = oldAddress;
2. PSM中的简单语句
2.1 调用语句:
CALL 过程名 (参数)
在宿主语言中调用形式:EXEC SQL CALL Foo(:x, 3);
作为另一个PSM中的语句
作为发送给基本SQL界面的SQL命令(不许调用函数):CALL Foo(1, 3);
2.2 返回语句:
RETURN 表达式;
只能出现在函数中,PSM的返回语句不会结束这个函数,在函数完成之前返回值都可能会改变。
2.3 局部变量声明
DECLARE 名字 类型;
2.4 赋值语句
SET 变量 = 表达式;
2.5 语句组
以分号结束,置于BEGIN和END之间
2.6 语句标号
用名字和冒号作为前缀来标识语句。
3.分支语句
IF <condition> THEN
<statement list>
ELSEIF <condition> THEN
<statement list>
ELSEIF
...
ELSE
<statement list>
END IF;
CREATE FUNCTION BandW(y INT, s CHAR(15)) RETURN BOOLEAN
IF NOT EXISTS(
SELECT * FROM Movies WHERE year = y AND studioName = s)
THEN RETURN TRUE;
ELSEIF 1 <=
(SELECT COUNT(*) FROM Movies WHERE year = y AND
studioName = s AND genre = 'comedy')
THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
4. PSM中的查询
可以有多种查询方式:
①使用子查询
②返回单一值的查询可用在赋值语句的右边
③使用单元组选择语句
CREATE PROCEDURE SomeProc(IN studioName CHAR(15))
DECLARE presNetWorth INTEGER;
SELECT netWorth
INTO presNetWorth
FROM Studio, MovieExec
WHERE presC# = cert# AND Studio.name = studioName;
...
④ 声明和使用游标
语句中不需要出现EXEC SQL
局部变量不使用冒号前缀
5.PSM中的循环
LOOP
<语句列表>
END LOOP;
中断循环: LEAVE 循环标识;
定义与SQLSTATE值相对应的条件名:
DECLARE 名字 CONDITION FOR SQLSTATE 值;
CREATE PROCEDURE MeanVar(
IN s CHAR(15),
OUT mean REAL,
OUT variance REAL
)
DECLARE Not_Found CONDITION FOR SQLSTATE '';
DECLARE MovieCursor CURSOR FOR
SELECT length FROM Movies WHERE studioName = s;
DECLARE newLength INTEGER;
DECLARE movieCount INTEGER; BEGIN
SET mean = 0.0;
SET variance = 0.0;
SET movieCount = 0;
OPEN MovieCursor;
movieLoop: LOOP
FETCH FROM MovieCursor INTO newLength;
IF Not_Found THEN LEAVE movieLoop END IF;
SET movieCount = movieCount + 1;
SET mean = mean + newLength;
SET variance = variance + newLength * newLength;
END LOOP;
SET mean = mean / movieCount;
SET variance = variance / movieCount - mean * mean;
CLOSE MovieCursor;
END;
6.循环
FOR循环
FOR <loop name> AS <cursor name> CURSOR FOR <query>
DO
<statement list>
END FOR;
WHILE循环:
WHILE <条件> DO
<语句列表>
END WHILE;
REPEAT循环:
REPEAT
<语句列表>
UNTIL <条件>
END REPEAT
CREATE PROCEDURE MeanVar(
IN s CHAR(15),
OUT mean REAL,
OUT variance REAL
)
DECLARE movieCount INTEGER; BEGIN
SET mean = 0.0;
SET variance = 0.0;
SET movieCount = 0;
FOR movieLoop AS MovieCursor CURSOR FOR
SELECT length FROM Movies WHERE studioName = s;
DO
SET movieCount = movieCount + 1;
SET mean = mean + length;
SET variance = variance + length * length;
END FOR;
SET mean = mean / movieCount;
SET variance = variance / movieCount - mean * mean;
END;
注意,在FOR循环中,用属性名表示查询结果!
7. PSM中的异常处理
DECLARE <下一步到哪里> HANDLER FOR <条件列表>
<语句>
转移的方式有下面三种:
CONTINUE:表示执行异常处理语句后,继续执行产生异常语句之后的语句
EXIT:表示执行异常处理语句后,离开异常处理的BEGIN END块,下一步执行该代码块之后的语句。
UNDO:与EXIT差不多,但是撤销已执行的该块语句对数据库和局部变化的影响。
CREATE FUNCTION GetYear(t VARCHAR(255)) RETURN INTEGER DECLARE Not_Found CONDITION FOR SQLSTATE '';
DECLARE Too_Many CONDITION FOR SQLSTATE ''; BEGIN
DECLARE EXIT HANDLER FOR Not_Found, Too_Many
RETURN NULL;
RETURN (SELECT year FROM Movies WHERE title = t);
END;
8.使用PSM函数和过程
可以像下面这样使用
INSERT INTO StarsIn(movieTitle, movieYear, starName)
VALUES('Remember the Titans', GetYear('Remember the Titans'), 'Denzel Washington');
【SQL】持久性存储模块PSM的更多相关文章
- MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别
1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...
- ASP.NET 工作流:支持长时间运行操作的 Web 应用程序
ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy 代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...
- SQL Server 2014新特性——事务持久性控制
控制事务持久性 SQL Server 2014之后事务分为2种:完全持久, 默认或延迟的持久. 完全持久,当事务被提交之后,会把事务日志写入到磁盘,完成后返回给客户端. 延迟持久,事务提交是异步的,在 ...
- SQL 语言 - 数据库系统原理
SQL 发展历程 从 1970 年美国 IBM 研究中心的 E.F.Codd 发表论文到 1974 年 Boyce 和 Chamberlin 把 SQUARE 语言改为 SEQUEL 语言,到现在的 ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- SQL Server事务、视图和索引
废话不多说,直接上干货 14:13:23 事务 概括:事务是一种机制,一个操作序列,包含一组数据库操作命令,并且把所有的命令作为一个整体一起 向系统提交或撤销操作 请求. 事务的特性: 1.原子性 ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- memcached简单介绍及在django中的使用
什么是memcached? Memcached是一个高性能的分布式的内存对象缓存系统,全世界有不少公司采用这个缓存项目来构建大负载的网站,来分担数据库的压力.Memcached是通过在内存里维护一个统 ...
- 团队项目-第五次Scrum 会议
时间:10.31 时长:30分钟 地点:教室(主南201) 工作情况 团队成员 已完成任务 待完成任务 解小锐 修复在接受任务时,前端和后端对接中的bug 完成员工信息的简单初始化 陈鑫 完成hire ...
- [翻译] ASP.NET Core 简介
ASP.NET Core 简介 原文地址:Introduction to ASP.NET Core 译文地址:asp.net core 简介 翻译:ganqiyin ...
- 一个简单的NetCore项目:1 - 搭建框架,生成数据库
1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中, ...
- lintcode-91-最小调整代价
91-最小调整代价 给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少. 注意事项 你可以假设数组 ...
- homework5 for java
- perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑
该标题可以抽象出来的问题是:两个前开后闭的区间 rangeA 和 rangeB,如何判断这两个区间是否重叠.这个问题在内核中非常重要,虚拟地址空间的划分需要它,perf中map_group的构建也需要 ...
- [转载] Win7下MATLAB 7.0下载地址和详细安装
移步http://blog.csdn.net/feecooling/article/details/7525140 MATLAB中文手册命令汇总http://wenku.baidu.com/view/ ...
- 在.cs代码文件中无法识别控件
原因:由于直接复制别人的网页文件到项目. 解决方案,自己右键,新建网页,再把控件代码复制到 aspx和 cs
- Codeforces Round #430 (Div. 2) Vitya and Strange Lesson
D.Vitya and Strange Lesson(字典树) 题意: 给一个长度为\(n\)的非负整数序列,\(m\)次操作,每次先全局异或\(x\),再查询\(mex\) \(1<=n< ...