存储过程文档格式.docx
- 文档编号:16927044
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:14
- 大小:24.65KB
存储过程文档格式.docx
《存储过程文档格式.docx》由会员分享,可在线阅读,更多相关《存储过程文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:
1)、变量说明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程控制命令(if…else…、while….)
4)、内部函数
存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。
存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。
同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
编辑本段二、使用存储过程有以下的优点:
*存储过程的能力大大增强了SQL语言的功能和灵活性。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
*可保证数据的安全性和完整性。
#通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
#通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
*在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。
这种已经编译好的过程可极大地改善SQL语句的性能。
由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
*可以降低网络的通信量。
*使体现企业规则的运算程序放入数据库服务器中,以便:
#集中控制。
#当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。
企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。
如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
简单讲:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
编辑本段三、存储过程的种类:
1)系统存储过程:
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
2)本地存储过程:
用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
3)临时存储过程:
分为两种存储过程:
一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
4)远程存储过程:
在SQLServer2005中,远程存储过程(RemoteStoredProcedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
5)扩展存储过程:
扩展存储过程(ExtendedStoredProcedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。
编辑本段四、存储过程的书写格式:
CREATEPROCEDURE[拥有者.]存储过程名[;
程序编号]
[(参数#1,…参数#1024)]
[WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}
]
[FORREPLICATION]
AS程序行
其中存储过程名不能超过128个字。
每个存储过程中最多设定1024个参数
(SQLServer7.0以上版本),参数的使用方法如下:
@参数名数据类型[VARYING][=内定值][OUTPUT]
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQLServer所支持的数据类型都可使用。
[=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。
[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。
例子:
CREATEPROCEDUREorder_tot_amt
@o_idint,
@p_totintoutput
AS
SELECT@p_tot=sum(Unitprice*Quantity)
FROMorderdetails
WHEREordered=@o_id
GO
例子说明:
该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id),由定单明细表(orderdetails)中计算该定单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序。
编辑本段五、存储过程的常用格式:
Createprocedureprocedue_name
[@parameterdata_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:
表示此参数是可传回的
with{recompile|encryption}
recompile:
表示每次执行此存储过程时都重新编译一次
encryption:
所创建的存储过程的内容会被加密
如:
表book的内容如下
编号书名价格
001C语言入门$30
002PowerBuilder报表开发$52
实例1:
查询表Book的内容的存储过程
createprocquery_book
select*frombook
go
execquery_book
实例2:
加入一笔记录到表book,并查询此表中所有书籍的总金额
Createprocinsert_book
@param1char(10),@param2varchar(20),@param3money,@param4moneyoutput
withencryption---------加密
insertintobook(编号,书名,价格)Values(@param1,@param2,@param3)
select@param4=sum(价格)frombook
执行例子:
declare@total_pricemoney
execinsert_book'
003'
'
Delphi控件开发指南'
$100,@total_price
print'
总金额为'
+convert(varchar,@total_price)
存储过程的3种传回值:
1)、以Return传回整数
2)、以output格式传回参数
3)、Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:
设有两个表为Product,Order_,其表内容如下:
Product
产品编号产品名称客户订数
001钢笔30
002毛笔50
003铅笔100
Order_
产品编号客户名客户订金
001南山区$30
002罗湖区$50
003宝安区$4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Createproctemp_sale
selecta.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数*b.客户订金as总金额
into#temptablefromProductainnerjoinOrder_bona.产品编号=b.产品编号-----此处要用别名
if@@error=0
Good'
else
Fail'
编辑本段六、编写对数据库访问的存储过程:
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下:
CREATEPROC[EDURE]procedure_name[;
number]
[
{@parameterdata_type}][VARYING][=default][OUTPUT]
[,...n]
[WITH
{
RECOMPILE
|ENCRYPTION
|RECOMPILE,ENCRYPTION
}
sql_statement[...n]
[]内的内容是可选项,而()内的内容是必选项,
例:
若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为:
CreateProcselect_delAs
Deletetmp
用户想查询tmp表中某年的数据的存储过程
createprocselect_query@yearintas
select*fromtmpwhereyear=@year
在这里@year是存储过程的参数
该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。
空:
表示该结点为顶层结点
fjdid(父结点编号)
结点n非空:
表示该结点的父亲结点号
dwmc(单位名称)
CREATEprocsearch_dwmc@dwidoldint,@dwmcresultvarchar(100)output
as
declare@stopint
declare@resultvarchar(80)
declare@dwmcvarchar(80)
declare@dwidint
setnocounton
set@stop=1
set@dwmc="
"
select@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidold
set@result=rtrim(@dwmc)
if@dwid=0
set@stop=0
while(@stop=1)and(@dwid<
>
0)
begin
set@dwidold=@dwid
select@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidold
if@@rowcount=0
set@result=@dwmc+@result
if(@dwid=0)or(@@rowcount=0)
continue
end
set@dwmcresult=rtrim(@result)
使用execpro-name[pram1pram2.....]
编辑本段七、在SQLServer中执行存储过程:
sql语句执行的时候要先编译,然后执行。
存储过程就是编译好了的一些sql语句。
用的时候直接就可以用了。
在SQLServer的查询分析器中,输入以下代码:
declare@tot_amtint
executeorder_tot_amt1,@tot_amtoutput
select@tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出定单编号为1的定单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。
存储过程具有以下特点:
1.具有立即访问数据库的能力;
2.是数据库服务器端的执行代码,在服务器执行操作时,减少网络通讯,提高执行效率。
3.保证数据库安全,自动完成提前设定的作业。
编辑本段八、存储过程的缺点
1:
调试麻烦,但是用PL/SQLDeveloper调试很方便!
弥补这个缺点。
2:
移植问题,数据库端代码当然是与数据库相关的。
但是如果是做工程型项目,基本不存在移植问题。
3:
重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4:
如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的。
维护起来更加麻烦!
编辑本段九、存储过程中临时表的创建问题
(针对SQL2000/2OO5)
可以创建本地和全局临时表。
本地临时表仅在当前会话中可见;
全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符(#table_name),而全局临时表的名称前面有两个编号符(##table_name)。
SQL语句使用CREATETABLE语句中为table_name指定的名称引用临时表:
CREATETABLE#MyTempTable(colaINTPRIMARYKEY)
INSERTINTO#MyTempTableVALUES
(1)
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则SQLServer必须能够区分由不同用户创建的表。
为此,SQLServer在内部为每个本地临时表的表名追加一个数字后缀。
存储在tempdb数据库的sysobjects表中的临时表,其全名由CREATETABLE语句中指定的表名和系统生成的数字后缀组成。
为了允许追加后缀,为本地临时表指定的表名table_name不能超过116个字符。
除非使用DROPTABLE语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。
由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。
但调用创建此表的存储过程的进程无法引用此表。
所有其它本地临时表在当前会话结束时自动除去。
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。
任务与表之间的关联只在单个Transact-SQL语句的生存周期内保持。
换言之,当创建全局临时表的会话结束时,最后一条引用此表的Transact-SQL语句完成后,将自动除去此表。
十、特殊的存储过程-触发器 1.触发器的概念及作用
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。
触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
当对某一表进行诸如Update、Insert、Delete这些操作时,SQLServer就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
除此之外,触发器还有其它许多不同的功能:
(1)强化约束(Enforcerestriction)
触发器能够实现比CHECK语句更为复杂的约束。
(2)跟踪变化Auditingchanges
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3)级联运行(Cascadedoperation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。
例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4)存储过程的调用(Storedprocedureinvocation)。
为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。
例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。
此外一个表的同一类型(Insert、Update、Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。
当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。
可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
2.触发器的种类
SQLServer2000支持两种类型的触发器:
AFTER触发器和INSTEADOF触发器。
其中AFTER触发器即为SQLServer2000版本以前所介绍的触发器。
该类型触发器要求只有执行某一操作(InsertUpdateDelete)之后,触发器才被触发,且只能在表上定义。
可以为针对表的同一操作定义多个触发器。
对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder来完成此任务。
INSTEADOF触发器表示并不执行其所定义的操作(Insert、Update、Delete),而仅是执行触发器本身。
既可在表上定义INSTEADOF触发器,也可以在视图上定义INSTEADOF触发器,但对同一操作只能定义一个INSTEADOF触发器。
编辑本段十一、Oracle中的存储过程:
1
1.创建过程
与其它的数据库系统一样,Oracle的存储过程是用PL/SQL语言编写的能完成一定处理功能的存储在数据库字典中的程序。
语法:
create[orreplace]procedureprocedure_name
[(argment[{in|inout}]type,
argment[{in|out|inout}]type
{is|as}
<
类型.变量的说明>
(注:
不用declare语句)
Begin
执行部分>
exception
可选的异常处理说明>
end;
1.1这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。
而INOUT表示传递参数和返回参数;
1.2在存储过程内的参数只能指定参数类型;
不能指定长度;
1.3在AS或IS后声明要用到的变量名称和变量类型及长度;
1.4在AS或IS后声明变量不要加declare语句。
2.使用过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS、Oracle开发工具或第三方开发
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 过程