存储过程学习笔记(SQL数据库

一、   存储过程简介

Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量、条件执行和其他强大的编程功能。

存储过程相对于其他的数据库访问方法有以下的优点:

(1)重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

(2)提高性能。存储过程在创建的时候就进行了编译,将来使用的时候不用再重新编译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。

(3)减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

(4)安全性。参数化的存储过程可以防止SQL注入式的攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

存储过程一共分为了三类:用户定义的存储过程、扩展存储过程以及系统存储过程。

其中,用户定义的存储过程又分为Transaction-SQL和CLR两种类型。

Transaction-SQL 存储过程是指保存的Transaction-SQL语句集合,可以接受和返回用户提供的参数。

CLR存储过程是指对.Net Framework公共语言运行时(CLR)方法的引用,可以接受和返回用户提供的参数。他们在.Net Framework程序集中是作为类的公共静态方法实现的。(本文就不作介绍了)

二、   存储过程的创建

例如:

-- 如果存储过程存在,就删除

IF Object_ID(‘proc_GetWellProduct‘) IS NOT NULL

DROP PROCEDURE proc_GetWellProduct

GO

-- 创建储存过程

CREATE PROCEDURE  proc_GetWellProduct

AS

......

三、   注释

1、-- 单行注释,从这到本行结束为注释,类似C++,c#中//

2、/* … */ 多行注释,类似C++,C#中/* … */

四、   变量

变量类型:

(int, smallint, tinyint, decimal,float,real, money ,smallmoney, text ,image, char, varchar......)

2、语法:

DECLARE +“变量名”+“类型”

例如:

declare @ID int --申明一个名为@ID的变量,类型为int型

五、   变量赋值

例如:

--从数据表中取出第一行数据的ID,赋值给变量@id,然后打印出来

Declare @ID int

Set @ID = (select top(1) categoryID from categories)

Print @ID

注意:赋值时如果是SQl查询语句,整个查询语句都要用括号括起来。

六、   打印

在SQL Server窗口中打印出变量的值

语法:

PRINT ‘any ASCII text‘ | @local_variable | @@FUNCTION | string_expr

七、   比较操作符

? > (greater than).

? < (less than).

? = (equals).

? <= (less than or equal to).

? >= (greater than or equal to).

? != (not equal to).

? <> (not equal to).

? !< (not less than).

? !> (not greater than).

八、   语句块

形式:Begin ... end

将多条语句作为一个块,类似与C++,C#中的{ }

例如:

IF (......)

begin

......

End

九、   While@@fetch_status = 0)循环

DECLARE @strLoginID VARCHAR(16)

BEGIN

declare db cursor for

SELECT LoginID FROM dbo.s_Users WHERE len(UnitCoding) in(9,12)

END

open db

fetch next from db into @strLoginID

while @@fetch_status = 0

BEGIN

insert into s_P_User

select @strLoginID,LevelID from s_P_User where LoginID = ‘aa‘

fetch next from db into @strLoginID

END

close db

deallocate db

@@fetch_status = 0?如何理解?这是我从联机帮助里面找的资料

返回值  说明

0:     FETCH 语句成功。

-1:    FETCH 语句失败或行不在结果集中。

-2:    提取的行不存在。

十、   执行其他存储过程 EXEC

EXEC 存储过程名 参数1,参数2...

例如

EXEC proc_GetWellProduct 1,‘2011-07-01‘

十一、 游标

1、游标的简介:

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

2、游标的组成:

1)、游标包含两个部分:一个是游标结果集、一个是游标位置。

2)、游标结果集:定义该游标得SELECT语句返回的行的集合。

游标位置:指向这个结果集某一行的当前指针。

3、游标的分类:

游标共有3类:API服务器游标、Transaction-SQL游标和API客户端游标。其中前两种游标都是运行在服务器上的,所以又叫做服务器游标。

API服务器游标

    API服务器游标主要应用在服务上,当客户端的应用程序调用API游标函数时,服务器会对API函数进行处理。使用API函数和方法可以实现如下功能:

   (1)打开一个连接。

(2)设置定义游标特征的特性或属性,API自动将游标影射到每个结果集。

(3)执行一个或多个Transaction-SQL语句。

(4)使用API函数或方法提取结果集中的行。

API服务器游标包含以下四种:静态游标、动态游标、只进游标、键集驱动游标(Primary key)

静态游标的完整结果集将打开游标时建立的结果集存储在临时表中,(静态游标始终是只读的)。静态游标具有以下特点:总是按照打开游标时的原样显示结果集;不反映数据库中作的任何修改,也不反映对结果集行的列值所作的更改;不显示打开游标后在数据库中新插入的行;组成结果集的行被其他用户更新,新的数据值不会显示在静态游标中;但是静态游标会显示打开游标以后从数据库中删除的行。

动态游标与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。结果集中的行数据值、顺序和成员每次提取时都会改变。

只进游标不支持滚动,它只支持游标从头到尾顺序提取数据行。注意:只进游标也反映对结果集所做的所有更改。

键集驱动游标同时具有静态游标和动态游标的特点。当打开游标时,该游标中的成员以及行的顺序是固定的,键集在游标打开时也会存储到临时工作表中,对非键集列的数据值的更改在用户游标滚动的时候可以看见,在游标打开以后对数据库中插入的行是不可见的,除非关闭重新打开游标。

Transaction-SQL游标

    该游标是基于Declare Cursor 语法,主要用于Transaction-SQL脚本、存储过程以及触发器中。Transaction-SQL游标在服务器处理由客户端发送到服务器的Transaction-SQL语句。

在存储过程或触发器中使用Transaction-SQL游标的过程为:

(1)声明Transaction-SQL变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从数据类型隐式转换得到的数据类型。

(2)使用Declare Cursor语句将Transaction-SQL游标与Select语句相关联。还可以利用Declare Cursor定义游标的只读、只进等特性。 

(3)使用Open语句执行Select语句填充游标。

(4)使用Fetch Into语句提取单个行,并将每列中得数据移至指定的变量中。注意:其他Transaction-SQL语句可以引用那些变量来访问提取的数据值。Transaction-SQL游标不支持提取行块。

(5)使用Close语句结束游标的使用。注意:关闭游标以后,该游标还是存在,可以使用Open命令打开继续使用,只有调用Deallocate语句才会完全释放。

 

客户端游标

该游标将使用默认结果集把整个结果集高速缓存在客户端上,所有的游标操作都在客户端的高速缓存中进行。注意:客户端游标只支持只进和静态游标。不支持其他游标。

4、游标的生命周期

游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。

[1]声明游标:

是为游标指定获取数据时所使用的Select语句,声明游标并不会检索任何数据,它只是为游标指明了相应的Select 语句。

Declare 游标名称 Cursor 参数

声明游标的参数:

(1)Local与Global:Local表示游标的作用于仅仅限于其所在的存储过程、触发器以及批处理中、执行完毕以后游标自动释放。Global表示的是该游标作用域是整个会话层。由连接执行的任何存储过程、批处理等都可以引用该游标名称,仅在断开连接时隐性释放。

(2)Forward_only与Scroll:前者表示为只进游标,后者表示为可以随意定位。默认为前者。

(3)Static、Keyset与Dynamic: 第一个表示定义一个游标,其数据存放到一个临时表内,对游标的所有请求都从临时表中应答,因此,对该游标进行提取操作时返回的数据不反映对基表所作的修改,并且该游标不允许修改。Keyset表示的是,当游标打开时,键集驱动游标中行的身份与顺序是固定的,并把其放到临时表中。Dynamic表示的是滚动游标时,动态游标反映对结果集内所有数据的更改。

(4)Read_only 、Scroll_Locks与Optimistic:第一个表示的是只读游标,第二个表示的是在使用的游标结果集数据上放置锁,当行读取到游标中然后对它们进行修改时,数据库将锁定这些行,以保证数据的一致性。Optimistic的含义是游标将数据读取以后,如果这些数据被更新了,则通过游标定位进行的更新与删除操作将不会成功。

标准游标:

Declare MyCursor Cursor 
            For Select * From Master_Goods

只读游标

Declare MyCusror Cursor

For Select * From Master_Goods

For Read Only

可更新游标

Declare MyCusror Cursor

For Select * From Master_Goods

For UpDate

[2]打开游标:

使用Open语句用于打开Transaction-SQL服务器游标,执行Open语句的过程中就是按照Select语句进行填充数据,打开游标以后游标位置在第一行。

打开游标:

全局游标:Open Global MyCursor            局部游标: Open MyCursor

[3]读取游标数据:

在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。

Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  From MyCursor

Into @GoodsID,@GoodsName

其中:

Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next

Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。

First表示返回结果集中的第一行,并且将其作为当前行。

Last表示返回结果集中的最后一行,并且将其作为当前行。

Absolute n 如果n为正数,则返回从游标头开始的第n行,并且返回行变成新的当前行。如果n为负,则返回从游标末尾开始的第n行,并且返回行为新的当前行,如果n为0,则返回当前行。

Relative n 如果n为正数,则返回从当前行开始的第n行,如果n为负,则返回从当前行之前的第n行,如果为0,则返回当前行。

[4]关闭游标:

调用的是Close语句,方式如下:Close Global MyCursor       Close MyCursor

[5]释放游标:

调用的是Deallocate语句,方法如下:Deallocate Glboal MyCursor       Deallocate MyCursor

十二、 经验小结

1、存储过程里定义不了数组。如果是sqlserver,那么你可以用表变量,游标来实现你的功能。

2、Top函数中如果有参数,则参数要用括号括起来,否则会报错。

例如:

select Top (@i) WellID From T_Well where PlatformID [email protected] order by WellID asc

3、判断一个查询值是否为空(有记录,只是值为“NULL”)

例如:

--申明一个变量

Declare @WellProduct int

--给变量赋值(@WellID为一个已赋值的参数)

set @WellProduct=(select WellProduct from T_WellRecord where [email protected])

--判断

IF (@WellProduct IS not NULL)

......

4、判断查询的记录是否为空(既不存在这条记录)

例如:

-- 判断(@WellID为一个已赋值的参数)

if exists(select WellID from T_Well where [email protected])

时间: 2024-08-25 20:39:13

存储过程学习笔记(SQL数据库的相关文章

MySQL学习笔记—SQL服务器模式汇总

MySQL学习笔记-SQL服务器模式汇总 MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式.这样每个应用程序可以根据自己的需求来定制服务器的操作模式. 模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查.这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使用MySQL. 你可以用–sql-mode="modes"选项启动mysqld来设置默认SQL模式.如果你想要重设,该值还可以为空(–sql-mode ="&q

oracle学习笔记 SQL语句执行过程剖析讲课

oracle学习笔记 SQL语句执行过程剖析讲课 这节课通过讲述一条SQL语句进入数据库 和其在数据库中的整个的执行过程 把数据库里面的体系结构串一下. 让大家再进一步了解oracle数据库里面的各个进程.存储结构以及内存结构的关联关系. 首先来讲整个体系中有客户端.实例和数据库 数据库里有三类文件 控制文件ctl.数据文件dbf.日志文件log 实例中SGA有六大池子 第一大内存区shared pool即共享池 第二大内存区buffer cache 第三块是redo log 我们主要讲上面的三

Symfony2学习笔记之数据库操作

数据库和Doctrine让我们来面对这个对于任何应用程序来说最为普遍最具挑战性的任务,从数据库中读取和持久化数据信息.幸运的是,Symfony和Doctrine进行了集成,Doctrine类库全部目标就是给你一个强大的工具,让你的工作更加容易. Doctrine是完全解耦与Symfony的,所以并不一定要使用它. 一个简单例子:一个产品,我们首先来配置数据库,创建一个Product对象,持久化它到数据库并把它读回来. 首先我们需要创建一个bundle: $php app/console gene

SQL学习笔记之数据库专题(四):浅谈JDBC用法

数据库厂商提供的用来操作数据库用的jar包就是数据库驱动.各个厂商如果提供各自的数据库驱动的话会导致开发人员学习成本太高,所以sun公司提供了一套数据库驱动应该遵循的接口规范,这套规范就叫做JDBC,本质上是很多的接口.简而言之,JDBC就是一套操作数据库的接口规范,由于所有的数据库驱动都遵循JDBC规范,我们在学习和使用数据库时只要学习JDBC中的接口就可以了. 组成JDBC的2个包:java.sql,javax.sql,开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实

Mysql DBA高级运维学习笔记-mysql数据库介绍

本文为我自己学习老男孩MySQL DBA 高级运维课程的学习笔记,内容均出自老男孩MySQL DBA 高级运维课程,老男孩老师讲的很好,非常感谢老男孩老师.我是一个菜鸟刚接触运维,如果我写的文章有不对的地方:请各位行业的精英.老师多多批评指点,呵呵~ 1.1 数据库介绍 1.1.1 什么是数据库?简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织.存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据. 1.2 数据库的

Django 学习笔记之三 数据库输入数据

假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介绍往数据库中添加数据,django默认的是sqlite3数据库. 在建立完django_blog项目后,不要忘了把 blog 加入到 settings.py 中的 INSTALLED_APPS 中. 一.同步数据库,创建相应的表 具体的参照Django 学习笔记之二的的同步数据库. 二.数据输入 下

mysql存储过程学习笔记

1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做

Python学习笔记020——数据库基本操作

本数据库的操作是Linux虚拟机平台下进行的 1 启动和链接MySQL服务 1.1 服务端 (1)查看服务状态 sudo /etc/init.d/mysql stauts (2)启动服务端 sudo /etc/init.d/mysql start (3)停止服务端 sudo /etc/init.d/mysql stop (4)重启服务 sudo /etc/init.d/mysql restart/reload 1.2 客户端连接服务端 命令格式 mysql -h主机名 -u用户 -p密码 如果是

SQL存储过程学习笔记(一)

一.存储过程的概念 简单来说,存储过程,就是一个为了完成特定功能的SQL语句集合,它经过编译后存储在数据库中.用户通过指定存储过程的名称并传递相应参数来执行它. SQL SERVER中分为系统提供的存储过程和用户自定义的存储过程两类.系统提供的存储过程,可以在任何数据库中调用而不必加数据库名,可以在master数据中查看:用户自定义的存储过程,是由用户根据需求进行创建.编写来完成特定功能的存储过程,也是我们主要学习的战场. 二.存储过程的优点 存储过程的实现,主要是用T-SQL编程语言完成.利用