分布式DBA:SQL存储过程知识总结(2)
作者:Roger 来源:51cto.com 发布时间:2009-02-24 17:17:00
SQL 存储过程格式
与单个 SQL 语句不同,大部分情况中,SQL 存储过程体由一个或多个复合 SQL 语句组成。复合 SQL 语句只是由关键字 BEGIN 和 END 封装的两个或多个 SQL 语句或 SQL PL 对象,并且以分号结尾。一条 * IC 复合 SQL 语句可以认为是单个的整体吗?如果在其中产生任何未处理的错误条件,所有执行到该点的语句都被认为已经失败,并且回滚对数据库所做的任何更改。
当复合语句用来创建 SQL 存储过程体时,它可以包含几个逻辑部分。为了正确地开发一个 SQL 存储过程,使用的每个部分都必须以非常特定的顺序实现。每个逻辑部分必须依据的实现顺序如下所示: <标签:> BEGIN
变量声明
条件声明
游标声明
条件处理程序声明
赋值,流程控制,SQL语句和其它复合语句
END <标签>
正如这个格式结构所示,可选的变量、条件和条件处理程序声明必须在存储过程逻辑(使用 SQL PL 流程控制语句实现)和 SQL 语句之前。游标可以在任何地方声明,但是最好在任何条件处理程序声明之前定义。
SQL 存储过程可以由遵循此格式的一个或多个复合语句(或块)组成,这些块可以嵌套或依次执行。为了清晰地显示流程控制,每个块都可以加上标签,从而可以包含许多 SQL 语句。这使进行控制转移语句引用时更加容易实现精确性。
清单 2 显示一个其存储过程体由几个嵌套复合 SQL 语句组成的 SQL 存储过程,它们遵循刚才所述的格式。可以在 DB2 9 SQL Reference(卷 2)中的标题 “复合 SQL(存储过程)” 下找到关于这种格式的更多信息,以及如何对每个部分进行编码的详细信息和例子。
清单 2. 饱含多个子句的存储过程
CREATE PROCEDURE hr.adjust_salary
(IN empid INTEGER, IN rating INTEGER, OUT msg VARCHAR(128))
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
DETERMINISTIC
LANGUAGE SQL
main: BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE c1 CURSOR WITH RETURN FOR SELECT * FROM hr.employees;
error_handler: BEGIN
DECLARE EXIT HANDLER FOR not_found
SIGNAL SQLSTATE '20000' SET MESSAGE_TEXT = 'Employee ID not found';
work: BEGIN * IC
IF (rating = 1) THEN
UPDATE hr.employees SET salary = salary * 1.10
WHERE emp_id = empid;
ELSEIF (rating = 2) THEN
UPDATE hr.employees SET salary = salary * 1.05
WHERE emp_id = empid;
ELSEIF (rating = 3) THEN
UPDATE hr.employees SET salary = salary * 1.03
WHERE emp_id = empid;
ELSE
UPDATE hr.employees SET put_on_plan = 'Y'
WHERE emp_id = empid;
END IF;
SET msg = 'Updated record for employee with ID = ' || CHAR(empid);
END work;
END error_handler;
OPEN c1;
END main
调用 SQL 存储过程
创建 SQL 存储过程之后,就可以从另一个 SQL 存储过程或从一个客户端应用程序交互式地调用它(使用命令行编辑器或 CLP 等工具)。通过执行 CALL 语句调用 SQL 存储过程;这个语句的基本语法如下: CALL [ProcedureName] ( <[ParameterValue] | [OutputValue] | NULL> ,...)
其中:
ProcedureName 标识指定给要调用的存储过程的名称。记住,调用存储过程时必须使用存储过程名,而不是专用名。
ParameterValue 标识要传递给所调用的存储过程的一个或多个参数值。
OutputValue 标识一个或多个接收由所调用存储过程返回的值的参数标记或主机变量。
您可以从 CLP 调用清单 1 中所示的 SQL 存储过程(通过连接到合适的数据库和执行类似以下的 CALL 语句): CALL conv_temp.f_to_c(98.6, ?)
当这个语句被执行时,值 98.6 通过名称为 TEMP_F 的输入参数传递给存储过程,问号(?)被用作一个占位符,用于将通过名称为 TEMP_C 的输出参数所返回的值。
可以从嵌入的 SQL 应用程序使用如下的 CALL 语句来调用相同的存储过程: EXEC SQL CALL conv_temp.f_to_c(98.6, :TempC)
在这种情况,TempC 是主机变量的名称,该变量使用与 REAL DB2 数据类型兼容的特定于编程语言的数据类型来声明。
效率和性能
SQL 存储过程提供有效的方法将业务规则逻辑从应用程序移动到数据库。通常,这种移动带来极大的性能提升,因为在服务器上完成处理,并且必须通过网络传输的消息更少。使用 SQL 存储过程保证在访问数据库的所有应用程序中一致地实施业务规则。并且因为 SQL 存储过程中的逻辑可以单独修改,所以当业务规则改变时不必重新编写应用程序。
不管是设计新的数据库应用程序还是只想简化日常操作,都可以寻找机会使用 SQL 存储过程。如果您发现 SQL 存储过程的开发和部署在您的工作中很有用,那么您可能想成为一名 IBM 认证的 DB2 9.5 SQL 存储过程开发人员。


猜你喜欢
- 本文实例讲述了Python高级变量类型。分享给大家供大家参考,具体如下:目标列表元组字典字符串公共方法变量高级知识点回顾Python 中数据
- 1、自动化代码中,用到了哪些设计模式?单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式2、什么是断言( Assert) ?断
- 析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数。析构函数__del__调用:A、使用del 显式
- 解决此问题的几个关键点如下:1、该现象只会出现在NTFS文件系统中。2、由NTFS文件系统的访问权限导致。 一般手工操作的解决方案
- #/usr/bin/env python#-*- coding:utf-8 -*-"""1.解析 cronta
- Atom是一款功能强大的跨平台编辑器,插件化的解决方案为atom社区的繁荣奠定了基础。任何人都可以把自己做的组件贡献在github上,并能方
- 优点:·减少使用空间·使后面的背景层模糊或者渐隐出现让用户的焦点集中在当前层。什么时候使用(对话框等)模式窗口?·图片/视频灯箱效果·联系表
- php的命名空间功能已经出来很久了,但是一直以来没怎么深究过,这次赶着有时间所以特意翻着手册做一个整理和总结帮助自己完善完善,原本准备一篇写
- 前言Matplotlib的可以把很多张图画到一个显示界面,在作对比分析的时候非常有用。对应的有plt的subplot和figure的add_
- 下面是代码,如果看不懂,建议先把表格的一些<tr><td>的表格原理弄清楚了,就可以了代码如下:<table&
- 目录一、axis简介二、不一样的axis对于axis=0三、总结补充:python中某些函数axis参数的理解在我们使用Python中的Nu
- 位置参数这是一个求等差数列和的函数,使用必需要传入一个参数n,这就是位置参数def sum(n): sum=0 &
- 要在密码两字中间添加空格,发现直接添加 是识别不了的,正确写法为:代码: <el-form-item label=
- 在使用前必须弄明白JWT的相关知识,可以看我的另一篇博文:https://www.jb51.net/article/166843.htm什么
- 关于截取字符串指定长度的自定义函数很多,各式各样!不过大多原理都是一个样,循环字符串判断每一个字符的asc码!我这里也有一个,示例函数如下:
- 1、后单下划线例如: data_其实这种就是为了防止跟系统关键字重名了,比如 python 里是不是有个关键字 class但是我也想用 cl
- 1. 创建一个新的环境打开Anaconda Navigator,找不到的win10左下角输入一下就能找到了,如下图。这里通过列表下面的cre
- 一、创建虚拟环境python -m venv env通过执行命令,创建一个名为env的虚拟环境,命令执行完毕后会出现一个env文件夹,这是一
- Sys.path 指定用于模块搜索路径的字符串列表也可以通过sys模块的append方法在Python环境中增加搜索路径。Sys.path.
- 第一种方法:递归def perms(elements): if len(elements) <=1