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的更多相关文章

  1. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

  2. ASP.NET 工作流:支持长时间运行操作的 Web 应用程序

    ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy   代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...

  3. SQL Server 2014新特性——事务持久性控制

    控制事务持久性 SQL Server 2014之后事务分为2种:完全持久, 默认或延迟的持久. 完全持久,当事务被提交之后,会把事务日志写入到磁盘,完成后返回给客户端. 延迟持久,事务提交是异步的,在 ...

  4. SQL 语言 - 数据库系统原理

    SQL 发展历程 从 1970 年美国 IBM 研究中心的 E.F.Codd 发表论文到 1974 年 Boyce 和 Chamberlin 把 SQUARE 语言改为 SEQUEL 语言,到现在的 ...

  5. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

  6. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  7. SQL Server事务、视图和索引

    废话不多说,直接上干货 14:13:23 事务 概括:事务是一种机制,一个操作序列,包含一组数据库操作命令,并且把所有的命令作为一个整体一起 向系统提交或撤销操作 请求. 事务的特性:   1.原子性 ...

  8. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

  9. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. C++的几种字符类型

    我们在C学过了char字符类型. 在C++中,char是基本的字符类型,但却不仅仅有这一种字符类型! 类型 含义 该类型数据所占的最小比特位数 char 字符 8位(即可表示28个字符) wchar_ ...

  2. OpenCV中的按钮问题

    在HighGUI中,没有显示提供任何形式的按钮.一般有两种方法替代: 1.用只有两个状态的滑动条来替代按钮.开关(switch)事实上就是只有两个状态的滑动条,这两个状态是on和off.然后通过回调函 ...

  3. 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息

    如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...

  4. Redis学习笔记之基础篇

    Redis是一款开源的日志型key-value数据库,目前主要用作缓存服务器使用. Redis官方并没有提供windows版本的服务器,不过微软官方开发了基于Windows的Redis服务器Micro ...

  5. JAVA实现定时器功能

    在接口开发时,有一种开发模式叫定时器模式,可以理解为每经过一段预设的时间就会执行一次事件,而在我们的工作中,这个事件所实现的功能一般是将两个系统的数据信息进行同步,这样就实现了两个系统通过接口进行对接 ...

  6. 关于逻辑运算符&&和||及!

    && 表示and ,|| 表示or,!表示not. And(&&):对两个Boolean表达式执行逻辑和. AndAlso(&):与AndAlso类似,关键差异 ...

  7. Springboot2.0 集成shiro权限管理

    在springboot中结合shiro教程搭建权限管理,其中几个小细节的地方对新手不友好,伸手党更是无法直接运行代码,搭建过程容易遇坑,记录一下.关键的地方也给注释了. 版本:springboot版本 ...

  8. 为什么比IPVS的WRR要好?

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  9. 洛谷 P4168 [Violet]蒲公英 解题报告

    P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...

  10. Noip2016滚粗记QAQ

    day1 t1 XBG #include<map> #include<cstdio> #include<string> #include<string.h&g ...