c数据库存储过程
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
(1)c数据库存储过程扩展阅读:
SQL中存储过程优点:
1、重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
4、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
B. 讲解Sybase存储过程的建立和使用
存储过程的特点
Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务 存储租缺过程由SQL语句和流程控制语句组成 它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理 指示调用成功或失败;返回若干个参数值给调用过程或批处理 为调用者提供动态结果;在远程SQL Server中运行等
存储过程的性能特点如下:
·存储过程是预编译过的 这就意味着它与普通的SQL语句或批处理的SQL语句不同 当首次运行一个存储过程时 SQL Server的查询处理器对其进行分析 在排除了语法错误之后形成存储在系统中的可执行方案 由于查询处理的大部分工作已经完成 所以存储过程执行速度很快
·存储过程和待处理的数据都放在同一台运行SQL Server的计算机上 使用存储过程查询当地的数据 效率自然很高
·存储过程一般多由Client端通过存储过程的名字进行调用 即跨网传送的只是存储过程的名字及少量的参数(如果有的话) 而不是构成存储过程的许多SQL语句 因此可以减少网络传输量 加快系统响应速度
·存储过程还有着如同C语言子函数那样的被调用和返回值弊搭辩的方便特性
所以 存储过程大大增强了SQL语言的功能 效率和灵活性 掌握和应用好存储过程 对进一步发挥Sybase数据库系统的强大功能有着重要的意义
存储过程的语法规则
建立存储过程的语法规则为:
CREATEPROCere[owner ]procerename[;number] [[(]@parameter_namedatatype[=default][OUTput] [ @parameter_namedatatype[=default][OUTput]] [)]] [WITHREPILE] ASSQL_statements
使用存储过程的语法规则为:
[EXECute][@return status=] [[[server ]database ]owner ]procerename[;number] [[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput] [ [@parameter_name=]value|[@parameter_name=]@variable[OUTput] ]] [WITHREPILE]
[page]下面简要介绍这两个命令的常用选项以及建立和使用存储过程的要点 关于选项的更为详细的说明请参考有关手册
·[[[server ]database ]owner ]procere_name:存储过程的名字
·@parameter_name datatype[=default][OUTput]:形式参数(形参)的名称 类型 df ault是赋予的缺省值(可选) OUTput指定本参数为输出参数(可选) 形参是存储过程中的自变量 可以有多个 名字必须以@打头 最长 个字符
·SQL_statements:定义存储过程功能的SQL语句
·@return_status:接受存储过程返回状态值的变量
·[@parameter_name=]value:实际参数(实参) @parameter_name为实参的名称(可选) 如果某个实参以@parameter_name=value提供 那么随后的实参也都要采用这一形式提供
·[@parameter_name=]@varialbe[OUTput]:将变量@varialbe中的值作为实参传递给形参@parameter_name(可选) 如果变量@varialbe是用来接受返回的参数值 则选项OUTput不可缺少
存储过程的建立和使用 我们将通过几个例子进行枝配介绍
假设有一个用下述语句生成的技能工资表RS LS GZ JiNeng:
create table RS_LS_GZ_JiNeng /*技能工资表*/
(GeRen_id char( ) /*个人代码 */
RiQi *** alldatetime /*执行日期 */
YuanYin_id char( ) null /*变动原因代码 */
JinE *** allmoney) /*技能工资金额 */
该表存储着某单位员工多年来技能工资的历史档案
例 如果要查询全体员工的技能工资变动历史 则可先建立一个存储过程p RsGz JiNeg All:
createprocerep_RsGz_JiNeng_Allas select* fromRS_LS_GZ_JiNeng orderbyGeRenid RiQi
然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:
execute p_RsGz_JiNeng_All
本例只显示查询到的数据 无输入 输出参量 是最简单的一个存储过程
例 如果要查询某人技能工资的变动历史 可建立另一个存储过程p_RsGz_JiNeng:
createprocerep_RsGz_JiNeng@c_GeRenIdchar( ) as select*fromRS_LS_GZ_JiNeng whereGeRen_id=@c_GeRenId orderbyRiQi
之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:
declare @GeRenId char( )
select @GeRenId= /*设要查询员工的个人代码为 */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId 是字符型变量 在调用该过程的批处理中 既可以用具体的值也可以用变量作为实参 用变量作实参(如本例)时 必须用del are语句加以说明 值得注意的是 在批处理的调用过程语句中 @c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名 不是批处理中的变量 所以不能将它列入d eclare语句的变量单中
例 如果要计算当月工资 就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:
createprocerep_RsGz_JiNeng_Slt (@c_GeRenIdchar( ) @ *** _JinE *** allmoneyoutput) as select@ *** _JinE=JinE fromRS_LS_GZ_JiNeng whereRiQi=(selectmax(RiQi) fromRS_LS_GZ_JiNeng
where GeRenid=@c GeRenId)/*找出历史记录中距离当前最近的日期*/
调用存储过程p_RsGz_JiNeng_Slt进行查询:
declare@GeRenIdchar( ) @JinE *** allmoney select@GeRenid= /*设要查询员工的个人代码为 */ select@JinE= executep_RsGz_JiNeng_slt@c_GeRenId=@GeRenId @ *** _JinE=@JinEoutput
这里 变量 @JinE用来存储过程形参@ *** _JinE传回的金额 在调用过程语句中 @ *** _JiE = @JinE output中的output不可省略 否则 变量@JinE将得不到形参传回的数值而始终为零(等于初值)
例 查到了个人代码为 员工的技能工资就显示其历史纪录 查不到则显示一条出错信息
createprocerep_RsGz_JiNeng_Rtn @c_GeRenIdchar( ) as declare@ErrCode *** allint select@ErrCode= ifexists(select*fromRS LS GZ JiNeng whereGeRenid=@c GeRenId) begin select* fromRS_LS_GZ_JiNeng whrerGeRen_id=@c_GeRenId orderbyRiQi return@ErrCodE end eslE begin select@ErrCode= return@ErrCodE end
调用存储过程p_RsGz_JiNeng_Rtn:
declare@GeRenIdchar( ) @RtnCode *** allint select@GeRenId= select@RtnCode= execute@RtnCode=p_RsGz_JiNeng_Rtn@c_GeRenId=@GeRenId if@RtnCode= print Nothisone!
存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值 这个值被称为状态值 它向调用者反映存储过程执行的成败状态 在本例中 如果查不到指定员工技能工资的任何记录时 就认为 查无此人 返回出错状态值 否则 返回成功状态值
调用过程的批处理语句使用变量@RtnCode存储返回的状态值 一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode= ) 就显示一条信息 No this one! [page]
小结
上述四个例子简要介绍了存储过程常用的几种形式 从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性
lishixin/Article/program/Oracle/201311/17494
C. 如何使用mysql的API在c/c++的代码中,创建一个存储过程
MySQL的概述
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。MySQL的官方网站的网址是:
[编辑本段]MySQL的特性
1.使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统
3.为多种编程语言提供了API。这些编程语言包括C、C++、Eiffel、Java、Perl、php、Python、Ruby和Tcl等。
4.支持多线程,充分利用CPU资源
5.优化的SQL查询算法,有效地提高查询速度
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名
7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径
8.提供用于管理、检查、优化数据库操作的管理工具
9.可以处理拥有上千万条记录的大型数据库
[编辑本段]MySQL的应用
与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器。由于这四个软件都是遵循GPL的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。
[编辑本段]MySQL管理
可以使用命令行工具管理MySQL数据库(命令mysql 和 mysqladmin),也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。
phpMyAdmin是由php写成的MySQL资料库系统管理程式,让管理者可用Web接口管理MySQL资料库。
phpMyBackupPro也是由PHP写成的,可以透过Web接口创建和管理数据库。它可以创建伪cronjobs,可以用来自动在某个时间或周期备份MySQL 数据库。
另外,还有其他的GUI管理工具,例如早先的mysql-front 以及 ems mysql manager,navicat 等等。
[编辑本段]Mysql存储引擎
MyISAM Mysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务
InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定
BDB 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge 将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV 逻辑上由逗号分割数据的存储引擎
BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继
另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。
[编辑本段]Mysql最常见的应用架构
单点(Single),适合小规模应用
复制(Replication),适合中小规模应用
集群(Cluster),适合大规模应用
[编辑本段]mysql历史版本
MySQL公司目前在同时开发两个版本的软件,4.1版以及5.0版。4.1版本的代码已经发布并有望在8个月后公布最终代码。而5.0版本的最后产品将在6个月后发布。
MySQL4.1版本中增加了不少新的性能,包括对主键的更高速度的缓存,对子查询的更好的支持,以及应网络约会网站所要求的,基于地理信息的查询。
而其同步开发的5.0版本则把目标对准了企业用户,对于4.1版本中的所有新特性,5.0版本悉数收入囊中,并且独具以下特点:对外键的良好支持;系统自动报错机制以及对存储过程的充分支持。
SQL全称是“结构化查询语言(Structured Query Language)”
SQL(STructured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL同时也是数据库脚本文件的扩展名。
SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。他不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。
结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxporo、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。
美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有时被称为ANSI SQL。尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。
SQL语言包含4个部分:
※ 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。
※ 数据操作语言(DML),例如:INSERT、UPDATE、DELETE语句。
※ 数据查询语言(DQL),例如:SELECT语句。
※ 数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。
SQL语言包括三种主要程序设计语言类别的陈述式:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。
D. 什么是数据库存储过程
存储过程(Stored Procere)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
这类语言主要提供以下功能,让用户可以设计出符合应用需求的程序:
1、变量说明
2、ANSI(美国国家标准化组织)兼容的SQL命令(如Select,Update….)
3、一般流程控制命令(if…else…、while….)
4、内部函数
(4)c数据库存储过程扩展阅读:
种类
1、系统存储过程
2、本地存储过程
3、临时存储过程
4、远程存储过程
5、扩展存储过程
E. 存储过程和函数的区别
一、含义不同
1、存储过程:存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
2、函数:是由一个或多个 SQL 语句组成的子程序,可用于封装代码以便重新使用。函数限制比较多,如不能用临时表,只能用表变量等
二、使用条件不同
1、存储过程:可以在单个存储过程中执行一系列 SQL 语句。而且可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
2、函数:自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。
三、执行方式不同
1、存储过程:存储过程可以返回参数,如记录集,函数只能返回值或者表对象。存储过程的参数有in,out,inout三种,存储过程声明时不需要返回类型。
2、函数:函数参数只有in,而函数需要描述返回类型,且函数中必须包含一个有效的return语句。
F. Oracle数据库中,用存储过程显示一个表中的所有内容,存储过程应该怎么
以scott下的emp表为例:
declare
cursorc_jobis
selectempno,
ename,
job,
mgr,
hiredate,
sal,
comm,
deptno
fromemp;
c_rowc_job%rowtype;
begin
forc_rowinc_jobloop
dbms_output.put_line(c_row.empno||','||c_row.ename||','||c_row.job||','||
c_row.mgr||','||c_row.hiredate||','||c_row.sal||','||
c_row.comm||','||c_row.deptno);
endloop;
end;
结果:
G. 什么是存储过程
定义:
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?
Microsoft公司为什么还要添加这个技术呢?
那么存储过程与一般的SQL语句有什么区别呢?
存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,
如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储过程,这是我们所指的存储过程
常用格式
Create procere procee_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
如:
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52
实例1:查询表Book的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book
实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi 控件开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go
存储过程的3种传回值:
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中
实例3:设有两个表为Proct,Order,其表内容如下:
Proct
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Proct a inner join Order b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
&n bsp; print 'Fail'
go
存储过程介绍
一、先介绍一下什么是存储过程
存储过程是利用SQL Server所提供的Tranact-SQL语言所编写的程序。Tranact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix-4GL语言一样。这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:
1)、变量说明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程控制命令(if…else…、while….)
4)、内部函数
二、存储过程的书写格
CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]
[(参数#1,…参数#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数
(SQL Server 7.0以上版本),参数的使用方法如下:
@参数名 数据类型 [VARYING] [=内定值] [OUTPUT]
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
[=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。
例子:
CREATE PROCEDURE order_tot_amt @o_id int,@p_tot int output AS
SELECT @p_tot = sum(Unitprice*Quantity)
FROM orderdetails
WHERE ordered=@o_id
例子说明:
该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id),由定单明细表(orderdetails)中计算该定单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序
三、在SQL Server中执行存储过程
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出定单编号为1的定单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化 后存储在数据库服务器中,使用时只要调用即可。在ORACLE中,若干个 有联系的过程可以组合在一起构成程序包。
使用存储过程有以下的优点:
* 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可 以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。
* 可保证数据的安全性和完整性。
# 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
# 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
* 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出 了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执 行。
* 可以降低网络的通信量。
* 使体现企业规则的运算程序放入数据库服务器中,以便:
# 集中控制。
# 当企业规则发生变化时在服务器中改变存储过程即可,无须修改 任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运 算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序 工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可 以了,应用程序无须任何变化。