首页 > 代码库 > 数据库原理-过程化sql

数据库原理-过程化sql

sql语言是高度非过程化的语言

SQL是一种典型的非过程化程序设计语言

特点

只指定哪些数据被操纵,至于对这些数据要执行哪些操作,以及这些操作是如何执行的,则未被指定。

优点

在于它的简单易学,完全不用考虑上下文,因此已经成为关系数据库访问和操纵数据的标准语言。

与之相对应的是过程化程序设计语言,类似c/c++等高级语言都是过程化程序设计语言。

特点

一条语句的执行是与其前后的语句和控制结构(如条件语句、循环语句等)相关的

优点

与SQL相比,这些语言显得比较复杂,但优点是使用灵活,数据操纵能力非常强大。

为了弥补SQL在过程化控制方面的不足,许多商用数据库系统,都对标准SQL语言进行了扩充,增加了过程化控制部分,即所谓的PL/SQL。当然不同的数据库系统所做的扩充程度是很不同的。

过程化sql的两种形式

过程化SQL程序的基本结构是块,所有的过程化SQL程序都是由块组成的.

  1. 匿名块--每次执行都需要进行编译,不能被存储到数据库中,不能被其他过程化sql块调用。
  2. 命名块--编译后被保存在数据库中,可以反复调用,运行速度较快。

匿名块

注意:变量赋值和表达式赋值需要添加:

 

变量定义

变量名 数据类型[[not null ] :=初始表达式]变量名 数据类型[[not null] 初值表达式]

 

常量定义

常量名  数据类型 constant:=常量表达式

 

条件控制语句

if condition then    sequence_of_statements;end ifif condition then    sequence_of statement1;else    sequence_of statement2;end if;

 

循环控制语句

loop    sequence_of_statementend loopwhile condition loop    sequence_of_statementend loop

 

赋值

变量名:=表达式

 

错误处理

如果过程化SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句.

 

命名块

命名块有两种主要方式: 

 

  1. 存储过程

  2. 函数

 

存储过程

定义

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

优点

  1. 存储过程是早已经在数据库管理软件编译好的代码,当客户需要时可以直接调用服务器端的过程函数,也就是早就写好的sql语句,这样就节约大量的编译和优化时间,加快了服务速度。
  2. 存储过程降低了客户机和服务器之间的通信量.客户机上的应用程序只需要通过网络向服务器发出调用存储过程的名字和参数,就可以让关系数据库执行其中多条sql语句并进行数据处理。
  3. 方便管理和维护.可以把需要用到的规则或是程序提前写成过程放入数据库中,由数据库管理软件集中管理和维护。
  4. 当一个业务同时对多个表进行处理的时候采用存储过程比较合适。

缺点

  1. 存储过程化处理大量集中在数据库上,很多程序之间在数据库端被修改,没有经过验证测试,影响应用程序的安全性。
  2. sql语言本来是高度非过程化的语言,其开发目的就是简单易学不用向高级语言学习编程,即使添加了过程化处理,也不能像c语言等自由处理逻辑程序。。
  3. 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。
  4. 无法适应数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

使用方式

  • 创造存储过程
create or replace procedure 过程名([参数1,参数2...])as <过程化块>

 

  • 调用存储过程块
call/perform procedure 过程名([参数1...]);
  • 修改存储过程
alter procedure 过程名 compile
  • 删除存储过程
drop procedure 过程名()

 

函数

函数就是自定义函数,使用后u自己使用过程化sql设计定义的。函数和存储过程类似。

使用方式:

  • 创造函数
Create function function_name(参数列表)returns返回值类型
  • 删除函数
Dropfunction if existsfunction_name;
  • 修改函数
Alter functionfunction_name函数选项
  • 查看函数
Show function status like ‘partten’Show create functionfunction_name;

 

二者之间的区别

本质没有区别,但是参数、调用和返回值等细节上有些许差别。

技术分享 

参考文章:

http://www.cnblogs.com/ego/archive/2012/12/06/2804592.html

http://www.cnblogs.com/lengbingshy/archive/2010/02/25/1673476.html

 

数据库原理-过程化sql